C 创建固定大小的二叉树
我正在尝试创建一个二叉树。我得到的唯一信息是树中的节点数。我想到的第一件事是使用索引(BFS order)来跟踪总节点数,然后使用递归定义。这是我的伪代码C 创建固定大小的二叉树,c,algorithm,tree,binary-tree,C,Algorithm,Tree,Binary Tree,我正在尝试创建一个二叉树。我得到的唯一信息是树中的节点数。我想到的第一件事是使用索引(BFS order)来跟踪总节点数,然后使用递归定义。这是我的伪代码 N = 10 //binary tree total node count i = 0 //global integer function() if i > N return True create node i i = i + 1 function(i
N = 10 //binary tree total node count
i = 0 //global integer
function()
if i > N
return True
create node i
i = i + 1
function(i) //left
i = i + 1
function(i) //right
我必须在这个定义中使用一个全局变量,这让我觉得我可能违反了递归规则。有没有更好的方法来做我所做的事情,如果是这样的话,可以改进吗
注意:我问的是理论方法,而不是代码
编辑:我刚刚意识到这个方法失败了。我愿意听取建议
澄清:此树的要求是不向深度添加元素,如果之前的深度没有节点填充(所有节点都有2个子节点),请原谅我之前没有提到这一点,至于我在评论中提到的堆栈,它与问题无关,这只是迭代遍历树的常规方法。如果递归定义,树由三个元素组成:
- 根节点
- 左子树,即树本身
- 右子树,即树本身
NULL
现在,我们可以通过以下方式将范围[a,b]
中的数字分布到树中:
- 根目录包含
(a+b)/2
- 左子树递归地构建范围
[a,(a+b)/2-1]
- 右子树递归地构建范围
[(a+b)/2+1,b]
NULL
。此分布确保左子树和右子树的大小最多相差1,并且在填充另一个级别之前,每个级别都已完全填充
例如:
此外,该算法还构建了一个BST(实际上这基本上是二进制搜索的“反向”)。现在来看看算法本身:
function(a, b):
if b < a: return NULL
n = create node (a + b) / 2
n.left = function(a, (a + b) / 2 - 1)
n.right = function((a + b) / 2 + 1, b)
return n
或者,任何其他参数
a
和b
都应该工作,其中a+N-1=b
保持不变。这两个参数表示树应包含的范围(包括两个)。问题并不是说需要递归生成树;也许你误解了这个问题。至于生成的树:它基本上是一个链表,因为只会创建左孩子。至于i
:您的代码是不正确的,但是对于没有全局变量的解决方案,它已经走到了一半。您已经定义了没有参数的函数
,但将它与i
一起用作参数…@Paul我选择使用递归进行学习。但迭代法也是可行的,需要在程序中定义一个堆栈。你应该弄清楚你真正想要的是什么。特别是:对树的要求是什么?您的算法创建了一个完美的树,除了树将包含N+1
节点这一事实之外。这个问题和堆栈有什么关系?@Paul请检查编辑。好的。我会发布一个解决方案该死,这是先进的。你使用的方法有名字吗?用两个数字来跟踪索引?@Rockybilly,这两个数字只是用来表示一个范围。我怀疑这是否有一个特定的名称,因为它只是一种数据表示方式。我突然想到:我忘记了最初如何调用方法来创建树。我来编辑
function(a, b):
if b < a: return NULL
n = create node (a + b) / 2
n.left = function(a, (a + b) / 2 - 1)
n.right = function((a + b) / 2 + 1, b)
return n
function(1, N)