定义
平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。
如图,左图两边高度差没超过1,属于平衡二叉树(AVL树),右图两边高度差超过1,属于非平衡二叉树
平衡二叉树的失衡
如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡。
从上面可以看出,失衡原因是左右子树高度差到达了2
四种失衡情况
二叉树的失衡分为四种情况
LL(左左)失衡
左树的左侧比右树高了两层,因此是 左树的左侧 导致的失衡,所以叫左左
LR(左右)失衡
左树的右侧 导致的失衡
RL(右左)失衡
右树的左侧 导致的失衡
RR(右右)失衡
右树的右侧 导致的失衡
失衡调整
失衡之后,需要将AVL Tree调整为平衡状态,不同的失衡情况调整方法也不一样
LL(左左)失衡调整
如下图 将LL(左左)失衡的树型结构想象成用线链接的小球
- 用手将左树的头节点的小球提起来,一直提到比原始头节点还高的位置。此时,原始头节点"掉了下来",左树头节点成为新的头节点。
- 新的头节点有三个子节点,其中中间的那个节点是原来左树的右节点,把它的线解开,然后把它挂载到原始头节点的左侧
- 经过这两个步骤,LL(左左)失衡的AVL Tree调整平衡
失衡调整核心步骤总结:
- “提起”失衡子树,直到原始头节点“落下”,失衡子树的头节点成为新的头节点
- 将新头节点的中间节点(原始子树右节点),挂载到原始头节点的左侧
RR(右右)失衡调整
RR(右右)失衡调整 跟 LL(左左)失衡调整是同一个套路,我就不画那么详细了
如图,两种RR(右右)失衡调整
情况二
LR(左右)失衡调整
RL(右左)失衡调整
与 LR(左右)失衡调整相同的套路,先将RL(右左)失衡变成 RR(右右)失衡,然后在按 RR(右右)失衡的策略调整,具体我就不画了,感兴趣的同学可以动手画一下
平衡二叉树存在的问题
平衡二叉树 (AVL Tree) 每个节点下最多只有两个节点,当数据量变大了之后,树的高度就会增加,导致查询效率下降。
为了解决这个问题,人们又发明了平衡多路查找树 (B-Tree)