数据结构之AVL树

本文详细介绍了AVL树的平衡因子概念,解释了如何通过旋转操作维持树的平衡。针对不同的不平衡情况(LL、RR、LR、RL),阐述了对应的处理技巧,包括左旋、右旋以及复合旋转策略,旨在保持树的高度平衡,确保搜索效率。
摘要由CSDN通过智能技术生成

定义

平衡因子(balance factor)=| Height(leftTree) - Height(rightTree) | = 1

处理技巧

将其想象成一个天平。

比如右边节点多,比较重则会导致右边沉下去了,此时应当想办法让节点往左边靠,使得天平往左边旋转;

再比如左边节点较多,则左边会沉下去,此时就应当想办法拿几个节点过来天平右边,使得天平往右边旋转;

天平的节点移动操作放到树里面就应当是把中间的这个节点增大或者减小,那何时增大?何时减小?

当需要将天平右旋,则对应需要将二叉树根节点减小;

当需要将天平左旋,则对应需要将二叉树根节点增大;


平衡中的相关操作

LL

释意:左孩子的左孩子发生不平衡;

这个时候应该让不平衡树的根节点减小,让左边节点靠右一些,使得右边能够沉下去,使得左右两边符合AVL定义;

主要有以下三种树型,分别对应操作可看图:

LL图1

LL图2

LL图3

RR

释意:右孩子的右孩子发生不平衡;

此时应当让根节点变大,让右边的节点分一些到左边,使得平衡;

对应有以下三种情况:

RR图1
RR图2

RR图3

LR

释意:左孩子的右孩子发生了不平衡;

这是比较复杂的情况,不过和上面是相似的,最终目的也是为了让天平往右边偏;

LL最终的处理就是让树往右边旋转,那直接以LL的处理来处理情况会怎么样?

如下,处理完反而变成RL(见下),原因在于这种情况下,并不是偏在一条分支上,如LL或者RR都是往一条同方向的支路上偏,就相对容易调整,把根节点沉下去或者浮上来即可;

LR图1

上面说了,最终是要让节点往右偏,那在此之前,要解决的就是想办法将它处理成LL的格式,将节点往一条支路上偏,然后再将其做个右旋;

而将其处理成LL,那就需要想办法让节点10往下沉,把节点15往上浮。嗯对,其实就是将节点10做个左旋,而后,再按照LL的方式做个右旋;

处理流程如下:
LR图2

其他的情况处理:

LR图3

LR图4

RL

释意:右孩子的左孩子出现了不平衡;

与LR相反,最终是为了将其往左边偏;
参考LR的处理,可知是先将树的格式处理成RR,再做个左旋转;

相关情况处理如下:
RL图1
RL图2

RL图3


代码实现

// TODO

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值