接上,
算法导论 13.2 旋转
当在某个结点 x x 上做 左旋 时,假设它的右孩子是 而不是 T.NIL T . N I L ; x x 可以为其右孩子不是 结点的树内任意结点。左旋以 x 到 y 的链为”支轴”进行。它使 y 成为该子树新的根结点, x x 成为 的左孩子, y y 的左孩子成为 的右孩子。
pseudocode
课后习题:
13. 2-1 写出 RIGHT_ROTATE 的伪代码
RIGHT_ROTATE(T, y)
{
x = y.left;
y.left = x.right;
if(x.right! = T.NIL)
x.right.p = y;
x.p = y.p;
if(y.p == T.NIL)
T.root = x;
else if(y.p.left == y)
y.p.left = x;
else y.p.right = x;
x.right = y;
y.p = x;
}
13. 2-2 证明:在任何一棵树有
n
n
个结点的二叉搜索树中,恰有 次可能的旋转。
proof: 显然任意一对父子结点唯一确定一种旋转,又除根结点以外,所有结点均有一个父节点。
13. 2-3
13. 2-4 证明:任何一棵含有
n
n
个结点的二叉搜索树可以通过 次旋转,转变为其他任何一棵含有
n
n
个结点的二叉搜索树。(提示:先证明至多 次右旋足以将树变为一条右侧伸展的链。)
proof: 定义 右链 为从根开始不断向右的链,
从最右点开始,循环直至根结点:
如果
x
x
有左孩子,右旋,
退回
x
x
;
如果
x
x
没有左孩子, 向上;
观察这个操作,易知:每一次右旋都将一个元素加入右链,命题得证。
- 2-5 如果能够用一系列的 RIGHT_ROTATE 调用把一个二叉搜索树
T1
T
1
变为二叉搜索树
T2
T
2
,则称
T1
T
1
可以右转(right-converted)成
T2
T
2
。试给出一个例子表示两棵树
T1
T
1
和
T2
T
2
,其中
T1
T
1
不能右转成
T2
T
2
。然后,证明:如果
T1
T
1
可以右转成
T2
T
2
,那么它可以通过
O(n2)
O
(
n
2
)
次 RIGHT_ROTATE 调用来实现右转。
proof: 记 S S 为所有内部结点的 (右子数量 - 左子数量) 之和。下证: 随右旋严格递增。
考察一个右旋操作:
除了 x x 和 ,其他结点对 S S 并无贡献,
考察 S S 的增量
另一方面, S S 的上限是 ,即得。