我只是想知道是否有人能够为我澄清平衡树的定义。我知道“如果每棵子树都是平衡的,那么树就会平衡,而且两棵子树的高度最多相差一个。
如果这是一个愚蠢的问题我很抱歉,但是这个定义是否适用于每个节点一直到树的叶子,或者只适用于直接离开根的左右子树?我想另一种框架方式是,树的内部节点是否可能不平衡并且整个树保持平衡?
答案 0 :(得分:101)
约束通常递归地应用于每个子树。也就是说,只有在以下情况下树才能平衡:
据此,下一棵树是平衡的:
A
/ \
B C
/ / \
D E F
/
G
下一个不平衡,因为C的子树高度相差2:
A
/ \
B C <-- difference = 2
/ /
D E
/
G
也就是说,第一点的具体约束取决于树的类型。上面列出的是AVL trees的典型值。
例如,Red-black trees强加了一个更柔和的约束。
答案 1 :(得分:40)
有几种方法可以定义“平衡”。主要目标是将所有节点的深度保持为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)
答案 2 :(得分:7)
这两件事没有区别。想一想。
让我们采用一个更简单的定义,“即使数字为零,或者数字减去2,也是正数。”这是否说8即使6是偶数?或者这说8即使6,4,2和0是偶数?
没有区别。如果它说8即使6是偶数,它也说6即使4是偶数。因此它也说即使2是偶数也是4。因此它表示2即使0是偶数也是如此。所以如果它说8即使6是偶数,它(间接)说8即使6,4,2和0是偶数。
这里也是一样的。任何间接子树都可以通过一系列直接子树找到。因此,即使它只直接应用于直接子树,它仍然间接应用于所有子树(以及所有节点)。
答案 3 :(得分:3)
平衡树是一棵树,其高度为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
给定的定义&#34;树是平衡的,每个子树是平衡的,两个子树的高度最多相差一个&#34;其次是AVL树。
由于AVL树是平衡的,但并非所有平衡树都是AVL树,平衡树不能保持这个定义,内部节点可能不平衡。但是,AVL树需要平衡所有内部节点。
答案 4 :(得分:2)
平衡树的目的是以最小的遍历(最小高度)到达叶子。 树的数量是分支数减1。 平衡树可能不是二进制。
答案 5 :(得分:0)