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

    技术2025-07-30  14

    二叉平衡查找树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

    Processed: 0.012, SQL: 10