算法导论13-2

读书笔记

本小节介绍了旋转方法来修改搜索树;

如果按照普通二叉搜索树的方式去插入和删除元素,必定会破坏红黑树的性质;

为了维护红黑树的性质,必须要改变书中某些节点的颜色指针结构

指针结构的修改是通过旋转实现的,分为左旋和右旋,具体操作如下图:

红黑树旋转

其中左旋的伪代码如下:

LEFT-ROTATE(T, x)// 这里的x请和上图中右侧的x相对应
y = x.right
x.right = y.left
if y.left != T.nil
	y.left.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.left = x
x.p = y

这里仅仅需要考虑指针变化,而不需要考虑颜色变化;

所以这里一共有三种变化需要考虑:

  1. 节点\(x,y\)的子节点的交换;
  2. 节点\(x,y\)的位置的交换;
  3. 指向当前子树的指针的变换;

课后习题

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 = y.p.left
	y.p.left = x
else 
	y.p.right = x
x.right = y
y.p = x

13.2-2

证明:在任何一棵有\(n\)个节点的二叉搜索树中,恰有\(n-1\)种可能旋转。

因为如果存在旋转,那必定是一个父节点和一个子节点,研究一种特殊情况,一棵竖着的二叉树,存在线段\(n-1\)条,推广到普通二叉树,线段仍然是\(n-1\)条;

13.2-3

假设在上图左边一棵树中,\(a,b,c\)分别为子树\(\alpha, \beta, \gamma\)中的任意节点。当节点\(x\)左旋之后,\(a,b,c\)的深度会如何变化?

\(a\)的深度加一;

\(b\)的深度不变;

\(c\)的深度减一;

13.2-4

证明:任何一棵含\(n\)个节点的二叉搜索树可以通过\(O(n)\)次旋转,转变为其他任何一棵含\(n\)个节点的二叉搜索树。(提示:先证明至多\(n-1\)次右旋足以将树转变为一条右侧伸展的链。)

不会。

posted @ 2021-01-15 11:46  ijkzen  阅读(142)  评论(0编辑  收藏  举报