1.重要性
影响树的平衡的因素主要有, 插入顺序, 删除节点。 一旦树失去了平衡性, 其查找
效率就会下降, 甚至失去查找效率。如下图:
如果我们将上图根节点为4的右子树全部删除,那么搜索二叉树将失去查找效率。
一棵 AVL 树有如下必要条件:
条件一: 它必须是二叉查找树。如下图 (黄色节点不满足)
条件二: 每个节点的左子树和右子树的高度差至多为 1。如下图 (黄色节点不满足)
2.失衡
将二叉树上节点的左子树高度减去右子树高度的值称为该节点的平衡因子(BF)
由上图我们可以看出:
节点 50, 左子对高度为 3, 右子树高度为 2, 所在 BF=1
节点 45, 左子对高度为 2, 右子树高度为 0, 所在 BF=2
节点 44, 左子对高度为 1, 右子树高度为 0, 所在 BF=1
节点 43, 左子对高度为 0, 右子树高度为 0, 所在 BF=0
节点 65, 左子对高度为 0, 右子树高度为 1, 所在 BF=-1
节点 70, 左子对高度为 0, 右子树高度为 0, 所在 BF=0
对于平衡二叉树, BF 的取值范围为[-1,1]。 如果发现某个节点的 BF 值不在此范
围, 则需要对树进行调整。
3.最小不平衡树
由上图可以看出:
左边二叉树的节点 45 的 BF = 1, 插入节点 43 后, 节点 45 的 BF = 2。 节点 45
是距离插入点 43 最近的 BF 不在[-1,1]范围内的节点, 因此以节点 45 为根的子树为
最小不平衡子树。
4.平衡
节点的插入或删除都有可能导致 AVL 树失去平衡, 因此, 失衡调整是插入与删除
操作的基础。 调节的宗旨是, 消灭不平衡因子, 且是搜索二叉树。 AVL 树的失衡调整可
以分为以下四种情况
4.1.左单旋(RR)
由上图可知:
当我们在右子树插入右孩子导致 AVL 失衡时, 我们需要进行单左旋调整。 旋转围
绕最小失衡子树的根节点进行。 在删除新节点时也有可能会出现需要单左旋的情况。
4.2.右单旋(LL)
由上图可知:
插入 3、 2 后出现了不平衡的情况。 此时的插入情况是“在左子树上插入左孩子导
致 AVL 树失衡”, 我们需要进行单右旋调整。
4.3.右左双旋(RL)
由上图可知:
需要进行两次旋转的原因是第一次旋转后, AVL 树仍旧处于不平衡的状态, 第二次
旋转再次进行调整。
这种情况, 总结起来就是“在右子树上插入左孩子导致 AVL 树失衡",此时我们需要
进行先右旋后左旋的调整。
4.4.右左双旋(RL)
根据对称性原理, 当我们“在左子树上插入右孩子导致 AVL 树失衡",此时我们需
要进行先左旋后右旋的调整。