这可能是最简单的AVL二叉平衡查找树讲解

二叉平衡查找树AVL详解

看懂这篇文章所需的知识点

树、二叉搜索树、树高、树深、层等概念

AVL树

概念任意节点的左右子树的高度差不能大于1的树即为AVL树,是为了解决在频繁插入删除等动态更新下出现的时间复杂度退化的问题,所以平衡的意思为:尽可能使整个树保持平衡,而不会出现左子树很高右子树很矮的情况。

AVL树失衡后平衡化操作分为四种:LL、RR、RL、LR
LL的意思为:整棵树失衡的原因在于根节点的左节点的左节点导致的失衡,有可能是左节点的左节点本身(即一条链的情况)导致的失衡,或者是左节点的左节点上多添加了节点导致的失衡
其他RR、RL、LR类似

左节点的左节点本身(即一条链的情况)导致的失衡:
在这里插入图片描述
此图中,A的左子树树深为2,右子树树深为0,即2-0>=2,即整体失衡,根节点为A,此时为LL型,即A节点的左节点(B)的左节点(C)本身导致的失衡。

左节点的左节点上多添加了节点导致的失衡

在这里插入图片描述
此时以A为根节点的左子树深度为3,右子树深度为1,3-1>=2,失衡,此时也为LL型,失衡节点为D,因为它加了一个F节点导致的失衡。

**那么如何分辨LL、RR、LR、RL的L和R呢?**很简单,根据失衡的树中,如果左子树深度大于右子树深度(例如上面的LL),则该情况为LL或LR,反之则为RR或RL

LL型详解

LL型分成三种情况

LL型第一种情况

先说解决方案:以根节点的左节点当做旋转中心,将根节点右旋
在这里插入图片描述

这种情况因为形成一条链,导致A节点的左右节点之差的绝对值大于等于2,所以需要进行平衡化操作,具体操作为:以根节点的左节点当做旋转中心,将根节点A右旋:
在这里插入图片描述

LL型的第二种情况

在这里插入图片描述
如何判断是否失衡:即一个节点一个节点的左右子树的深度来判断,例如上图B的左子树深度为2,右子树深度为1,此时2-1<2,平衡,当以A为根节点时,A的左子树深度为3,右子树深度为1,失衡,所以失衡的原因在左子树太深,即LL型或LR型(后面讲),且深度为各个节点中最大的数值

在这个图中:导致失衡的原因为D点上多了一个F导致的失衡(当把F去掉,整棵树平衡),所以就需要根据LL型的解决方法来解决:将根节点根据根节点的左节点做右旋,即A根据B做右旋,其他节点的关系保持不变即:
在这里插入图片描述此时由于B节点有右节点,即右旋前会先将B的右节点E去掉,然后再右旋,再根据查找树的规则将E插入到符合规则的位置,即A>E>B,此时旋转过来后要保持A>E>B,所以只能插在A的左节点处。

LL型第三种情况

在这里插入图片描述
第三种情况和第二种其实是一致的,只是F点由D的左节点改成了右节点,只影响结果中的F的位置,这里不足赘述
在这里插入图片描述

RR型

跟LL型一致,RR型为根节点的右节点的右节点导致的失衡
解决方案将根节点根据根节点的右子树左旋

RR第一种情况

在这里插入图片描述
很明显这是由于根节点的右节点的右节点本身导致的失衡,解决方案,A围着B做左旋
在这里插入图片描述

RR第二种情况

在这里插入图片描述
和LL一样,这里的原因是根节点的右子树的右子树由于增加了一个节点F导致的失衡,解决方案:
将A围着C左旋,这里有D点占了位置,此时LL一样,先将D点移除,待左旋完成后,再根据定义插入
![在

RR第三种情况

在这里插入图片描述
这里和第二种情况类似不再延伸

RL型

根据上面的讲解来推理:
RL为根节点的右节点的左节点导致的失衡
解决方法:先根据根节点的右节点根据失衡节点右旋变成RR,再根据RR的解决办法左旋即可

RL型第一种情况

在这里插入图片描述
由于根节点的右节点的左节点导致的失衡,此时需要根据根节点的右节点根据失衡节点右旋,即B根据C来右旋B,即
在这里插入图片描述
这就变成了一个RR,后根据RR的处理方式左旋即可,所以结果为:
在这里插入图片描述

RL型第二种情况

在这里插入图片描述

如何判断是RR、LL、RL、LR的哪一种类型?
先找出有问题子树,在这个图中,A节点的左子树的深度为1,右子树深度为3,所以右子树有问题需要平衡右子树,即RR或RL的一种,那么怎么确定是哪一种?具体方法为找到深度最深的那一条,即A-C-D-F,即是因为此条路径导致的不平衡,所以根据图来看,C为右节点,D为左节点,所以这一种情况为RL型,假如上图中是E节点的路径更长,那么就是RR了(具体问题具体分析)

所以在这张图中,我们需要把C根据失衡节点D点右旋,变成了RR,在左旋即可,其他未旋转节点之间的关系保持不变
在这里插入图片描述

RL型第三种情况

在这里插入图片描述这里和第二种情况一样,只改变了F节点的位置,由于旋转时会替换掉F节点,所以F节点需要先脱离,后旋转完成(一次旋转而不是成为平衡)后再插入

LR型

这个就和之前的一样了
LR为根节点的左节点的右节点导致的失衡
解决方法:先根据根节点的左节点根据失衡节点左旋变成LL,再根据LL的解决办法右旋即可

LR型第一种情况

在这里插入图片描述
先B根据A左旋,变成一个LL,再右旋
在这里插入图片描述

LR第二种情况

在这里插入图片描述这里不需要在讲解了

LR第三种情况

在这里插入图片描述这里同样不做赘述

总结

类型 操作方法
RR型 根节点根据根节点的右节点左旋
LL型 根节点根据根节点的左节点右旋
LR型 根节点的左节点根据失衡节点左旋变成LL再右旋
RL型 根节点的右节点根据失衡节点右旋变成RR再右旋

注意事项
在进行有些旋转的时候,如果旋转后的地方原本有节点,那么就先将原有节点删去,待旋转完成后根据搜索树的特点将其插入
假如来一张图,该如何判断失衡和什么类型的失衡?
这个位图都在上面回答了,分别在LL型第二种情况下,和RL型第二种情况下,请自行查看。

课后题

将 {12,4,1,3,7,8,10,9,2,11,6,5}组成一个AVL树,方法为逐个构建,然后在失衡的时候调整平衡,再添加子节点

正确答案为
在这里插入图片描述

相关来源

https://www.bilibili.com/video/BV1e4411x7rZ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章