维基百科的不平衡AVL树的例子如何真正失衡?

时间:2008-10-23 18:20:09

标签: data-structures binary-tree avl-tree

alt text

上面的图片来自"Wikipedia's entry on AVL trees",维基百科表示这是不平衡的。 这棵树怎么还没有平衡? 以下是文章的引用:

  

节点的平衡因子是其右子树的高度减去其左子树的高度,并且具有平衡因子1,0或-1的节点被认为是平衡的。具有任何其他平衡因子的节点被视为不平衡,需要重新平衡树。平衡因子可以直接存储在每个节点上,也可以根据子树的高度进行计算。

左右子树的高度均为4.左侧树的右侧子树的高度为3,仍然只有1小于4.有人可以解释我所缺少的内容吗?

4 个答案:

答案 0 :(得分:14)

节点76是不平衡的,例如,因为它的右子树的高度为0,左侧的高度为3。

答案 1 :(得分:13)

为了保持平衡,树中的每个节点都必须

  • 没有孩子,(成为“叶子”节点)
  • 有两个孩子。
  • 或者,如果它只有一个孩子,那个孩子必须是一片叶子。

    在你发布的图表中,9,54& 76违反了最后一条规则。

适当平衡,树看起来像:

Root: 23
(23) -> 14 & 67
(14) -> 12 & 17
(12) -> 9
(17) -> 19
(67) -> 50 & 72
(50) -> 54
(72) -> 76

更新:(差不多9年后,我在draw.io)创建了一个很酷的在线图表enter image description here

答案 2 :(得分:3)

直观地说,这是因为它不是那么小。例如,12应该是9和14的父节点。实际上,9没有左子树,所以它不平衡。树是一种分层数据结构,因此像“平衡”这样的规则通常适用于每个节点而不仅仅是根节点。

你是对的,根节点是平衡的,但不是树的所有节点都是。

答案 3 :(得分:3)

另一种看待它的方法是任何节点的高度h由下式给出:

h = 1 + max( left.height, right.height )

并且只要以下情况,节点就会失衡:

abs( left.height - right.height ) > 1

看着上面的树:

- Node 12 is a leaf node so its height = 1+max(0,0) = 1
- Node 14 has one child (12, on the left), so its height is = 1+max(1,0) = 2
- Node 9 has one child (14, on the right), so its height is = 1+max(0,2) = 3

要确定节点9是否平衡,我们会查看其子节点的高度:

- 9's left child is NULL, so 9.left.height = 0
- 9's right child (14) has height 2, so 9.right.height = 2

现在解决以显示节点9是不平衡的:

9.unbalanced = abs( 9.left.height - 9.right.height ) > 1
9.unbalanced = abs( 0 - 2 ) > 1
9.unbalanced = abs( -2 ) > 1
9.unbalanced = 2 > 1
9.unbalanced = true

可以对每个其他节点进行类似的计算。