红黑树 学习笔记2 - 旋转

接上,
算法导论 13.2 旋转

当在某个结点 x x 上做 左旋 时,假设它的右孩子是 y 而不是 T.NIL T . N I L ; x x 可以为其右孩子不是 T.NIL 结点的树内任意结点。左旋以 x 到 y 的链为”支轴”进行。它使 y 成为该子树新的根结点, x x 成为 y 的左孩子, y y 的左孩子成为 x 的右孩子。

这里写图片描述

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 个结点的二叉搜索树中,恰有 (n1) 次可能的旋转。
proof: 显然任意一对父子结点唯一确定一种旋转,又除根结点以外,所有结点均有一个父节点。

13. 2-3

13. 2-4 证明:任何一棵含有 n n 个结点的二叉搜索树可以通过 O(n) 次旋转,转变为其他任何一棵含有 n n 个结点的二叉搜索树。(提示:先证明至多 (n1) 次右旋足以将树变为一条右侧伸展的链。)
proof: 定义 右链 为从根开始不断向右的链,
从最右点开始,循环直至根结点:
如果 x x 有左孩子,右旋,
退回 x x
如果 x x 没有左孩子,x 向上;

观察这个操作,易知:每一次右旋都将一个元素加入右链,命题得证。

  1. 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 为所有内部结点的 (右子数量 - 左子数量) 之和。下证: S 随右旋严格递增。
    考察一个右旋操作:
    这里写图片描述
    除了 x x y,其他结点对 S S 并无贡献,
    考察 S S 的增量 ΔS=((1+|β|+|γ||α|)(|β||α|))+((|γ||β|)(|γ|1|α||β|))  =2+|α|+|γ|>1
    另一方面, S S 的上限是 O(n2) ,即得。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值