AVL树的插入操作(旋转)图解(2)

 

AVL树的插入操作(旋转)图解

           

AVL树的插入操作(旋转)图解

     》【左右双旋当前节点的平衡因子为-1,在当前节点较高的左子树的右子树b或者c中插入一个节点,该子树的高度增加1,使当前节点的左孩子的平衡因子变为1,当前节点的平衡因子变成-2,导致AVL树不再平衡,需要进行调整,采用先左后右双旋

(PPNode是10的父节点)

         

AVL树的插入操作(旋转)图解

AVL树的插入操作(旋转)图解

AVL树的插入操作(旋转)图解

       可以看到在这里插入的节点是插在了6节点的左子树,那么它当然也可以插入到6的右子树中,而且还可以是上图中的方框代表的子树都是空这种情况,此时就相当于是插入6这个节点。这样的话,最后更新节点的平衡因子就要注意了,我们稍后再分析;

 

     》【右左双旋】当前节点的平衡因子为1,在当前节点较高的右子树的左子树b或者c插入新节点该子树的高度增加1,当前节点的右孩子的平衡因子变成-1,当前节点的平衡因子变成2,导致AVL树不再平衡,需要进行调整,采用先右后左双旋

      (PPNode是5的父节点)

AVL树的插入操作(旋转)图解

          

AVL树的插入操作(旋转)图解

AVL树的插入操作(旋转)图解

》》》》注意:上面两个双旋的图解只是其中的一种情况,在上面左右双旋的下面我已经提出来了,这里需要注意非常重要的一点,就是你插入了新节点之后会改变哪几个节点的平衡因子,显然插入的地方不一样没得到的结果也会有差异;

       因为每插入一个节点都要向上更新bf,我们总结一下遇到什么情况应该旋转,采用什么旋转:

若parent->bf=-2或者2的时候需要进行调整

》parent->bf=2,说明它的右树比左树高,设它的右孩子为pcur

    >若pcur->bf==1,执行左单旋

    >若pcur->bf==-1,执行右左双旋旋

》parent->bf=-2,说明它的左树比右树高,设它的左孩子为pcur

    >若pcur->bf==-1,执行右单旋

    >若pcur->bf==1,执行左右双旋单旋

 

我们可以看到,在旋转过程中平衡因子发生改变的节点只有parent和pcur这两个节点,那么旋转之后该怎样修改这两个节点的平衡因子呢。

     >对于左单旋和右单旋的情况,parent和pcur的平衡因子都会变为0,所以在旋转完成后把它们的平衡因子置成0

     >对于双旋,我们最后更新平衡因子的时候是需要分情况的

       

AVL树的插入操作(旋转)图解

     

AVL树的插入操作(旋转)图解

     那么通过上图的说明,我们就可以看出来,最终影响parent和subR节点平衡因子的是subRL这个节点,主要就是看新插入的节点到底是插在它的左子树还是右子树,当然还有一种情况就是图中矩形代表的子树都为空的情况,也就是subRL就是要插入的节点,那么总共就是这三种情况,对应出来如下:

          》subRL的平衡因子是0(插入的节点就是它本身)

          》subRL的平衡因子是-1(新节点插在subRL的左子树)

          》subRL的平衡因子是1 (新节点插在subRL的右子树)

 对应的最终subR和parent的平衡因子调整我就不再赘述了,画一画很容易明白的。    

================================================================

程序代码:

        >>插入 insert函数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8cb0033ce436377773430c846e02f630.html