一 定义
平衡二叉树,又称AVL树,它是一种特殊的二叉排序树。AVL树或者是一棵空树,或者是具有以下性质的二叉树:
- 深度是 O(logN)
- 左右子树的高度差的绝对值不能大于1
- 左右子树都是平衡二叉树
如下图所示:
二 不平衡出现的情况
如上图中所示,按照二叉树方式插入,总会造成不平衡,如果从A 几点出现不平衡,有四种情况:
- 1 对 A 的左儿子的左子树进行一次插入,记为 LL;
- 2 对 A 的左儿子的右子树进行一次插入,记为LR;
- 3 对 A 的右儿子的左子树进行一次插入,记为RL;
- 3 对 A 的右儿子的右子树进行一次插入,记为RR;
其中 1和4 是关于 A 点的镜像操作,2和3是关于A点的镜像操作,因此,理论上只两种情况,针对LL和RR的类型,通过一次对树的 单旋转 来处理,针对 LR和RL的类型,通过对树的一次 双旋转 来处理。
三 旋转
1 LL型
如上图所示,节点8的由于 6 的插入到了 其左孩子的 左子树 导致不平衡,属于 LL类型,用单旋转处理。
- LL 顺时针旋转,最低不平衡节点 8 高度降 1,左子树7 的 高度 加 1
- 同时节点 8 变为 7的右孩子
另一种情况,上面所说的是最简单的情况,节点8 没有右孩子,看下面的旋转
上面的从节点5是最小不平衡点,按照 LL单旋转,要先将 5 的左孩子3 的右孩子4 变为 5的左孩子,然后再执行上边的旋转;
- 总结就是:
- 找到最小的不平衡节点 A
- 将 A的左孩子的右子树,变为 A的左孩子,
- 然后,将A变为其左子树的右孩子
- 最后调整 节点的高度
代码实现如下
// LL 单旋转,顺时针的,根节点的左子树向上,根节点向下,1. 左子树的右子树,变为根节点左子树,2. 同时,根节