是否有一个技巧来解决`size`或`height`的二叉树问题?

时间:2014-02-20 10:28:11

标签: algorithm data-structures tree binary-tree binary-search-tree

关于binary trees,我了解sizeheight之间的区别:size是节点数,height of a tree是最大边数根到最远的叶子。

然而,在处理涉及height的问题时,我的思绪经常被扭曲,无法直接思考。

对于以下两个问题,它们非常相似,只有一个对size有约束,而另一个有height


例如,让我们首先使用size

  

在完全平衡的二叉树中,以下属性成立   每个节点:左子树中的节点数和数量   右子树中的节点几乎相等,这意味着它们的节点   差异不大于一。

     

编写一个函数来构建所有可能的完全平衡的二进制文件   给定节点数的树 - n 。该函数应该生成所有   通过回溯的解决方案。将字母'x'作为信息放入所有   树的节点。

只要属性被保留,这个问题就是生成所有可能完全平衡的二进制tress。

我认为size很简单。我能做的就是这样:

  1. 使用递归
  2. 如果n mod 2 = 1,则用n=n/2生成所有这些树,然后用新根合并每对树。
  3. 如果n mod 2 = 0,则生成一组具有n/2的树和另一组具有n/2-的树。然后将每一对(一组中的一个)与一个新根合并,也不要忘记交换每对中的元素。
  4. 如果n = 0,则返回仅包含一个Leaf
  5. 的集合
  6. 如果n = 1,则返回一个只有一个单一内部节点和两个叶子的集合。

  7. 当问题中的size更改为height时,我真的不知道如何巧妙地再思考。

      

    在高度平衡的二叉树中,以下属性成立   每个节点:其左子树的高度及其右侧的高度   子树几乎相等,这意味着它们的差异并不大   而不是一个。

         

    编写一个函数来构建所有可能的高度平衡二叉树   对于给定数量的节点 - n 。该功能应通过生成所有解决方案   回溯。将字母“x”作为信息放入所有节点   树。

    我认为如果涉及身高,事情就会变得随意。


    第二个问题的解决方案是否与第一个问题相同?

    我应该如何训练自己处理身高?诀窍在哪里?

1 个答案:

答案 0 :(得分:1)

不,这不一样。考虑:(每个节点的值表示其子树的高度)

     4
   /   \
  2     3
 /     / \
1     2   2
     / \ / \
    1  1 1  1

左子树有2个节点,右边有7个,但它是高度平衡的。

您需要做的第一件事是计算某个给定高度的最小和最大节点数(最大值只是2^n-1,最小值可以从高度1开始迭代计算,或者可能是也是一个公式。)

然后你需要遍历左子树和右子树的高度(这将是左子树的高度+ 1/0 / -1),如果我们可以使用这些来到n高度,即:这些高度加上一个的最大节点数为>= n,这些高度加上一个的最小节点数为<= n,循环遍历{{1}的所有组合,生成所有有效的树,并合并它们,类似于你为第一个问题所做的。

我希望这是有道理的。


处理涉及高度的问题并没有真正的诀窍 - 这种方法因问题而异。通常重要的是要记住,平衡树的高度为n,而高度~log2n的完整树具有n个节点。