Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建固定大小的二叉树_C_Algorithm_Tree_Binary Tree - Fatal编程技术网

C 创建固定大小的二叉树

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

我正在尝试创建一个二叉树。我得到的唯一信息是树中的节点数。我想到的第一件事是使用索引(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) //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)