创建固定大小的二叉树

时间:2016-12-08 00:20:13

标签: c algorithm tree binary-tree

我正在尝试创建一个二叉树。我唯一给出的是树中节点的数量。弹出的第一件事就是使用索引( 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个孩子),那么这个树的要求就是不向深度添加元素,请原谅我没有提到这个之前,对于我在评论中提到的堆栈,它与问题无关,只是迭代遍历树的常规方式。

1 个答案:

答案 0 :(得分:1)

如果以递归方式定义,树由三个元素组成:

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

所有这些可能是NULL

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

  • root包含(a + b) / 2
  • left subtree由递归范围[a, (a + b) / 2 - 1]构建
  • 右子树是由递归范围[(a + b) / 2 + 1, b]构建的

起点高于终点的范围可能被视为空,导致节点为NULL。此分布确保左右子树的大小最多相差1,并且每个级别完全填满,然后再填充另一个级别。

E.g:

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成立。这两个参数表示应该由树保存的范围(包括两者)。