13.2-1
RIGHT-ROTATE(T,x)
y = x.left
x.left = y.right
if y.right ≠ T.nil
y.right.p = x
y.p = x.p
if x.p == T.nil;
T.root = y
else if x == x.p.left
x.p.left = y
else x.p.right = y
y.right = x
x.p = y
13.2-2
一个父结点指向的右子女有一个左旋转,一个父结点指向的左子女有一个右旋转。也就是说有多少条边就有多少种可能的旋转,
n
个结点有
13.2-3
我理解的是把图 13-2 中的右边树中的结点
x
左旋变成图 13-2 中左边的的树,因此
13.2-4
首先证明可以旋转成一条单链表。对于根结点左边的孩子
x
,若
对于其他的任何一颗树,我们都可以旋转成一根右侧伸展的链。由可逆操作知道通过
O(n)
次旋转可以把一颗二叉搜索树转变为另外一颗二叉搜索树。
13.2-5
T1,T2
分别对应下图的左右二叉搜索树,显然
T1
不能右旋为
T2
。
通过右旋,
T1
的右子树中的点不能成为新的根,若
T1,T2
的根结点不同, 可以在
O(n)
的时间内将
T1
的根变为
T2
的根,然后递归调用根的右子树, 得
T(n)=T(n−1)+O(n)→T(n)=O(n2)
。