介绍
AVL树遵循高度平衡原则来调整自身的平衡性。
何为高度平衡?这里有一个概念,叫平衡因子。对于AVL树的每个结点,平衡因子是它的左子树高度和右子树高度的差值。
当所有结点的平衡因子的取值都在 -1,0,1的范围内,这颗二叉树才是一颗合格的AVL树。
下图是一颗典型的AVL树,每个节点标注了平衡因子:

其中,4结点左子树高度为1,没有右子树,所以平衡因子为1;其他结点计算方法一致。
操作方法
当二叉树的平衡被破坏(删除或者添加结点)时,有两种操作方法让树重新回到平衡。
- 左旋转
假设有父结点X和右孩子Y,逆时针旋转X和Y,使右孩子Y取代X成为父结点,X成为Y的左孩子,此为左旋转。

- 右旋转
假设有父结点X和左孩子Y,顺时针旋转X和Y,使左孩子Y取代X成为父结点,X成为Y的右孩子,此为右旋转。

树的不平衡状态可以通过对多个结点多次进行左右旋转来使其重新恢复平衡状态。
四种常见的场景
- 左左局面(LL)

如上图,结点A有一个左孩子B,结点B有一个左孩子C,结点1,2,3,4是个结点的子树。
这种情况下,我们以结点B为轴,将A结点进行右旋操作。

- 右右局面(RR)

如上图,结点A有右孩子B, B有右孩子C。
我们以结点B为轴,对结点A进行左旋操作。

- 左右局面(LR)

如上图,结点A有左孩子B,结点B有右孩子C。
注意了,这种情况我们没办法对A结点进行右旋来使树达到平衡,所以需要分步来处理它,先左旋B结点,使其变成「左左」树;

然后再右旋A结点使树平衡。

- 右左局面(RL)

如上图,结点A有右孩子B,结点B有左孩子C。
注意了,这种情况我们没办法对A结点进行左旋来使树达到平衡,所以需要分步来处理它,先右旋B结点,使其变成「右右」树;

然后再左旋A结点使树平衡。

当AVL树进行添加、删除操作的时候,都可以根据在上面找到对应的形态进行多次操作使树恢复平衡。
思维导图
