参考:AVL 树

1. 什么是 AVL 树

AVL 树,自平衡二叉查找树,名字来源于作者首字母大写。

在 AVL 树中,任一节点对应的两颗子树最大高度差为1,因此,AVL 树也称为高度平衡树。查找、删除、插入平均、最坏复杂度都是O(log n),增加和删除元素的操作可能触发一次或多次树旋转。

2. 平衡因子

AVL 树使用节点中的高度(height)属性测量节点是否平衡。高度是节点到最远叶子节点的距离。

AVLMeasuringBalance

指定节点 children 的相对高度决定该节点是否平衡,左右子树高度相差最大为1,高度差被称为平衡因子。

下面是一颗 AVL 树:

AVLBalanceHeight

蓝色表示高度,绿色表示平衡因子。

插入40后如下所示:

AVLInsert40

插入40后,平衡因子出现了大于等于2,或小于等于-2,即树失去平衡。虽然多个节点会失去平衡,但只需平衡最底部失去平衡的节点,树就会恢复平衡。

3. 旋转

让二叉搜索树恢复平衡的过程,称为旋转(Rorations)。旋转有两大基础操作:左旋和右旋。共有四种失去平衡类型:LL型、RR型、LR型、RL型。

3.1 RR 型

所谓的 RR 型就是节点的右子树的右子树导致其失去平衡,这时候需要左旋来解决。

对 25 左旋前后对比如下:

AVLLeftLeft

3.2 LL 型

所谓的 LL 型就是节点的左子树的左子树导致其失去平衡,这时候需要右旋来解决。

LL 型与 RR 型相反,当一系列左子树导致失衡,需进行右旋。

如下图中的 Z 导致其失去平衡,对 X 进行右旋操作如下:

AVLRightRight

3.3 RL 型

RL 就是将节点插入到了右子树的左子树上,导致失去平衡。

前面遇到的都是子树在同一侧(左侧或右侧),当向其插入36时,将出现以下情况:

AVLRightLeft

此时,左旋无法恢复平衡。需先对右子树右旋,再进行左旋。如下所示:

AVLRightLeftRotation

3.4 LR 型

LR 型和RL型刚好相反,如下所示:

AVLLeftRight