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
浙公网安备 33010602011771号