【问题标题】:Definition of a Balanced Tree平衡树的定义
【发布时间】:2011-11-04 20:56:17
【问题描述】:

我只是想知道是否有人可以为我澄清平衡树的定义。我有“如果每个子树都是平衡的并且两个子树的高度最多相差一个,那么一棵树是平衡的。

如果这是一个愚蠢的问题,我深表歉意,但这个定义是否适用于每个节点,一直到树的叶子,还是只适用于紧邻根部的左右子树?我猜想另一种方式是,一棵树的内部节点是否可能不平衡而整个树保持平衡?

【问题讨论】:

  • 只是想补充一点,我们正在谈论 Comp。子树的科学定义:树 T 的子树是由 T 中的一个节点及其在 T 中的所有后代组成的树。对于常规的数学定义(树的子图本身就是一棵树),这是不正确的.

标签: tree


【解决方案1】:

约束通常递归地应用于每个子树。也就是说,只有在以下情况下,树才是平衡的:

  1. 左右子树的高度最多相差 1,并且
  2. 左子树是平衡的,并且
  3. 右子树是平衡的

据此,下一棵树是平衡的:

     A
   /   \
  B     C  
 /     / \  
D     E   F  
     /  
    G  

下一个是不平衡的,因为 C 的子树的高度相差 2:

     A
   /   \
  B     C   <-- difference = 2
 /     /
D     E  
     /  
    G  

也就是说,第一个点的具体约束取决于树的类型。上面列出的是AVL trees 的典型。

Red-black trees,例如,施加更软的约束。

【讨论】:

  • 这看起来是最好的答案,除了应该提到的是,balanced tree 可以是非二进制的。
【解决方案2】:

有几种方法可以定义“平衡”。主要目标是保持所有节点的深度为O(log(n))。

在我看来,您所说的平衡条件适用于 AVL 树。
下面是AVL树的平衡条件的正式定义:

对于 AVL 中的任何节点,其左子树的高度与其右子树的高度相差最多 1。

下一个问题,什么是“height”?

二叉树中节点的“高度”是从该节点到叶子的最长路径的长度。

有一种奇怪但常见的情况:

人们将空树的高度定义为(-1)。

例如root的左孩子是null:

              A  (Height = 2)
           /     \
(height =-1)       B (Height = 1) <-- Unbalanced because 1-(-1)=2 >1
                    \
                     C (Height = 0)

再确定两个例子:

是的,平衡树示例:

        A (h=3)
     /     \
 B(h=1)     C (h=2)        
/          /   \
D (h=0)  E(h=0)  F (h=1)
               /
              G (h=0)

不,不是平衡树示例:

        A (h=3)
     /     \
 B(h=0)     C (h=2)        <-- Unbalanced: 2-0 =2 > 1
           /   \
        E(h=1)  F (h=0)
        /     \
      H (h=0)   G (h=0)      

【讨论】:

  • 请注意,此定义允许平衡树的不平衡子树。 (例如,通过将一个子节点添加到 D 并将另一个子节点添加到 G 来扩展上面的平衡树示例)这是有意的吗?
  • 不,它没有。 “对于 AVL 中的任何节点,其左子树的高度与其右子树的高度最多相差 1。”如果您将一个孩子添加到 D,那么 B 将不会遵循上述规则。因此,这棵树不会是 BBT。
  • 你的回答很冗长而且不准确
【解决方案3】:

这两件事没有区别。想一想。

让我们采用一个更简单的定义,“一个正数是即使它为零,或者那个数字减二是偶数。”这是否说 8 是偶数,即使 6 是偶数?还是说 8 是偶数,而 6、4、2 和 0 是偶数?

没有区别。如果它说 8 即使 6 是偶数,它也说 6 即使 4 是偶数。因此它也说 4 即使 2 是偶数。因此它说 2 是即使 0 是偶数。所以如果它说 8 即使 6 是偶数,它(间接地)说 8 是即使 6、4、2 和 0 是偶数。

这里也一样。任何间接子树都可以通过直接子树链找到。所以即使它只直接应用于直接子树,它仍然间接应用于所有子树(以及所有节点)。

【讨论】:

  • 假设根的值为 15。在右边,我有 16、17、18。在左边我有 14,13,12。那是一棵平衡的树吗?离开节点的每个子树的高度都在 1 以内。但是把根下的第一个节点向右取,它没有左孩子,但它的右孩子的高度是2。所以这个节点是不平衡的。对吗?
  • 正确。因此树是不平衡的。
  • 因此,为了平衡树 - 每个节点都必须平衡。美丽 - 非常感谢您的帮助。
  • @DavidSchwartz 为什么我们要尝试使用平衡树?我们为什么要关心一棵树是否平衡?
  • 这是迄今为止我在 SO 上看到的最复杂的答案 - 对于任何问题。很抱歉这么说。
【解决方案4】:

平衡树是高度为log(树中元素数)顺序的树。

height = O(log(n))
O, as in asymptotic notation i.e. height should have same or lower asymptotic
growth rate than log(n)
n: number of elements in the tree

“一棵树平衡,每个子树平衡,两个子树的高度最多相差一个”的定义是AVL树。

由于 AVL 树是平衡的,但并非所有平衡树都是 AVL 树,因此平衡树不包含此定义,并且它们的内部节点可能是不平衡的。但是,AVL 树需要平衡所有内部节点。

【讨论】:

    【解决方案5】:

    平衡树的目标是以最少的遍历(最小高度)到达叶子。 树的度数是分支数减 1。 平衡树可能不是二叉树。

    【讨论】:

      【解决方案6】:
      1. 树中节点的高度是从该节点向下到叶子的最长路径的长度,包括路径的开始和结束顶点。
      2. 如果其子树的高度相差不超过 1,则树中的节点是高度平衡的。
      3. 如果树的所有节点高度平衡,则树的高度平衡。

      【讨论】:

      • 可以说更简单。 A tree where no leaf is much farther away from the root than any other leaf.
      • 诸如“更远”之类的陈述是模棱两可的。在代码中实现需要一个精确的定义。
      • 布鲁。 As close to the root as the closest leaf node or only one node farther 然后。还是简单多了
      • 以上给出的是官方定义。它可以使用递归轻松实现。
      • @parsecer 的简单性在哪里:no leaf is much farther away from?我不得不读了 3 遍以上,仍然没有那么流畅地理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多