定义
平衡因子(balance factor)=| Height(leftTree) - Height(rightTree) | = 1
处理技巧
将其想象成一个天平。
比如右边节点多,比较重则会导致右边沉下去了,此时应当想办法让节点往左边靠,使得天平往左边旋转;
再比如左边节点较多,则左边会沉下去,此时就应当想办法拿几个节点过来天平右边,使得天平往右边旋转;
天平的节点移动操作放到树里面就应当是把中间的这个节点增大或者减小,那何时增大?何时减小?
当需要将天平右旋,则对应需要将二叉树根节点减小;
当需要将天平左旋,则对应需要将二叉树根节点增大;
平衡中的相关操作
LL
释意:左孩子的左孩子发生不平衡;
这个时候应该让不平衡树的根节点减小,让左边节点靠右一些,使得右边能够沉下去,使得左右两边符合AVL定义;
主要有以下三种树型,分别对应操作可看图:
RR
释意:右孩子的右孩子发生不平衡;
此时应当让根节点变大,让右边的节点分一些到左边,使得平衡;
对应有以下三种情况:
LR
释意:左孩子的右孩子发生了不平衡;
这是比较复杂的情况,不过和上面是相似的,最终目的也是为了让天平往右边偏;
LL最终的处理就是让树往右边旋转,那直接以LL的处理来处理情况会怎么样?
如下,处理完反而变成RL(见下),原因在于这种情况下,并不是偏在一条分支上,如LL或者RR都是往一条同方向的支路上偏,就相对容易调整,把根节点沉下去或者浮上来即可;
上面说了,最终是要让节点往右偏,那在此之前,要解决的就是想办法将它处理成LL的格式,将节点往一条支路上偏,然后再将其做个右旋;
而将其处理成LL,那就需要想办法让节点10往下沉,把节点15往上浮。嗯对,其实就是将节点10做个左旋,而后,再按照LL的方式做个右旋;
处理流程如下:
其他的情况处理:
RL
释意:右孩子的左孩子出现了不平衡;
与LR相反,最终是为了将其往左边偏;
参考LR的处理,可知是先将树的格式处理成RR,再做个左旋转;
相关情况处理如下:
代码实现
// TODO