4.22   Write the functions to perform the double rotation without the inefficiency of doing two single rotations.

直接进入主题,开始放图(记节点1,2,3分别为C1,C2,C3)

首先是LR旋转

如图1。节点3处的HeightLeft = 3 ,HeightRight = 1,|HeightLeft -HeightRight| = 2 >1所以该树是不平衡的。

所以我们应该先节点1进行左旋,即,如图2

              

 图2依旧处于不平衡的状态,节点3处|HeightLeft -HeightRight| = 2 >1,且是LL状态。所以对3进行右旋,即如下图:

 

 此时该树是处于平衡状态的,然后我们来进一步看里面的叶子发生的变化,先放一张完整变化图

 

 

 

 

 

 

 从图中可以看出

Circle2的左孩子B到了Circle1的右孩子的位置

即 C1->right = C2->left;

Circle2的右孩子C到了Circle3的左孩子的位置

即C3->left = C2->right;

 

 

 

 

 

 

 

因为旋转发生了位置的变化,所以要对三个节点的高度重新进行计算,利用height()函数。

最后附上LR旋转的代码

 同理RL旋转的过程也类似,直接放完整变化图

  过程不再赘述,直接附上代码

  以上就是我对本题的思考与理解,谢谢观看!

 posted on 2020-10-21 22:48  User_wwwt  阅读(187)  评论(0)    收藏  举报