平衡树的定义


100

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

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


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

Answers:


123

通常将约束以递归方式应用于每个子树。也就是说,仅在以下情况下树是平衡的:

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

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

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

下一个是不是平衡,因为C的子树2在其高度的不同:

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

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

例如,红黑树施加了较弱的约束。


50

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

在我看来,您所讨论的平衡条件适用于AVL树
这是AVL树的平衡条件的正式定义:

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

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

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

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

人们将空树的高度定义为(-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)      

1
注意,此定义允许平衡树的不平衡子树。(例如,通过在D上添加一个孩子,在G上添加另一个孩子来扩展上面的平衡树示例)是否有此目的?
gen

2
不,不是。“ 对于AVL中的任何节点,其左子树的高度与其右子树的高度最多相差1。” 如果您向D添加一个孩子,那么B将不会遵循上述规则。因此,该树不会是BBT。
约翰·雷德

1
您的答案很冗长且不准确
Marwen Trabelsi

9

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

让我们做一个更简单的定义:“一个正数是偶数,即使它是零或该数减去二是偶数。” 这是说8等于6还是偶数?还是说8、6、4、2和0是偶数?

没有区别 如果说8即使6是偶数,也说6即使4是偶数。因此,即使2是偶数,也说4是偶数。因此,即使0为偶数,也表示2为偶数。因此,如果说8等于6是偶数,则(间接地)说8等于6、4、2和0是偶数。

这是同一件事。任何间接子树都可以通过一系列直接子树找到。因此,即使仅直接应用于直接子树,也仍然间接应用于所有子树(因此也包括所有节点)。


1
假设根的值为15。在右边,我有16,17,18。在左下方,我有14,13,12。那是一棵平衡的树吗?节点外的每个子树的高度都在1以内。但是,将第一个节点放在根的右下方,它没有左子节点,但其右子节点的高度为2。因此该节点不平衡。那是对的吗?
Mark Soric

1
正确。因此,树不平衡。
David Schwartz

1
因此,为了平衡一棵树,必须平衡每个节点。美容-非常感谢您的帮助。
马克·索里克

1
@DavidSchwartz为什么我们要使用平衡树?为什么我们要关心一棵树是否平衡?
Dejell 2013年

3
到目前为止,这是我在SO上看到的最复杂的答案-任何问题。不好意思这么说。
Trevor

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树要求平衡所有内部节点。



0
  1. 树中节点的高度是从该节点向下到叶子的最长路径的长度,同时计算路径的起点和终点。
  2. 如果树中子节点的高度相差不超过1,则该节点是高度平衡的。
  3. 如果树的所有节点都是高度平衡的,则该树是高度平衡的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.