【问题标题】:Create binary tree of fixed size创建固定大小的二叉树
【发布时间】:2017-04-23 02:50:32
【问题描述】:

我正在尝试创建一棵二叉树。唯一给我的是树中节点的数量。我想到的第一件事是使用索引(BFS 顺序)来跟踪总节点数,然后使用递归定义。这是我的伪代码。

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个孩子),请原谅我没有提到这一点之前,至于我在cmets中提到的堆栈,和问题无关,只是迭代遍历树的常规方式。

【问题讨论】:

  • 问题不是说需要递归生成树;也许你误解了这个问题。至于生成的树:它基本上是一个链表,因为只会创建左孩子。至于i:您的代码不正确,但它已经是没有全局变量的解决方案的一半。您已经在没有参数的情况下定义了 function,但将其与 i 一起用作参数...
  • @Paul 我选择将递归用于学习目的。但迭代法也适用,需要在程序中定义一个栈。
  • 你应该弄清楚你真正想要什么。特别是:对树有什么要求?您的算法创建了一个完美的树,除了树将包含N + 1 节点这一事实。而这个问题和堆栈有什么关系?
  • @Paul 请检查编辑。
  • 好的。我会发布解决方案

标签: c algorithm tree binary-tree


【解决方案1】:

如果递归定义,一棵树由三个元素组成:

  • 一个根节点
  • 左子树,它本身就是一棵树
  • 右子树,它本身就是一棵树

所有这些都可能是NULL

现在我们可以通过以下方式将[a, b] 范围内的数字分配到树中:

  • 根目录包含(a + b) / 2
  • 左子树由范围[a, (a + b) / 2 - 1]递归构建
  • 右子树由范围[(a + b) / 2 + 1, b]递归构建

start 高于 end 的范围可能被视为空,并导致节点为 NULL。这种分布可确保左右子树的大小最多相差 1,并且在另一层被填充之前,每一层都被完全填满。

例如:

N = 6
                                  [0, 5]

                 [0, 1]              2                  [3, 5]

         [0]        1        []               [3]          4         [5]

 []       0     []                      []     3      []        []    5    []

此外,该算法构建了一个 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

可以通过调用生成树:

function(1, N)

或者,任何其他参数 ab 应该可以工作,其中 a + N - 1 = b 成立。这两个参数代表树应该持有的范围(包括两者)。

【讨论】:

  • 该死的,这太先进了。您使用的方法是否有名称,使用两个数字来跟踪索引?
  • @Rockybilly 好吧,这两个数字只是用来表示一个范围。我怀疑它有一个特定的名称,因为它只是一种数据表示方式。我突然想到:我忘记了如何最初调用该方法来创建树。我会编辑
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2013-12-29
  • 2011-05-08
相关资源
最近更新 更多