第13章 红黑树
13.1 红黑树的性质
一颗红黑树是满足下面红黑性质的二叉搜索树:
1. 每个结点或是红色,或是黑色
2. 根结点是黑色的
3. 每个叶结点(NIL)是黑色的
4. 如果一个结点是红色的,则它的两个子结点都是黑色的
5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
黑高:从某个结点x出发(不含该结点)到达一个叶结点的任意一条简单路径上的黑色结点个数称为该结点的黑高,记为 bh(x) 。
引理:一颗有n个内部结点的红黑树的高度至多为 2lg(n+1) 。以任一结点x为根的子树至少包含 2bh(x)−1 个内部结点
13.2 旋转
LEFT-ROTATE(T,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
elseif x == x.p.left
x.p.left = y
else x.p.right = y
y.left = x
x.p = y
RIGHT-ROTATA(T,x)
y = x.left
x.left = x.right
if y.right != T.nil
y.right.p = x
y.p = x.p
if x.p == T.nil
T.root = y
elseif x == x.p.left
x.p.left = y
else x.p.right = y
y.right = x
x.p = y
13.3 插入
RB-INSERT总共花费 O(lgn) 时间
RB-INSERT(T,x)
y = T.nil
x = T.root
while x != T.nil
y = x
if z.key < x.key
x = x.left
else
x = x.right
z.p = y
if y == T.nil
T.root = z
elseif z.key < y.key
y.left = z
else y.right = z
z.left = T.nil
z.right = T.nil
z.color = RED
RB-INSERT-FIXUP(T,z)
RB-INSERT-FIXUP(T,z)
while z.p.color == RED
if z.p == z.p.p.left
y = z.p.p.right
if y.color == RED
z.p.color == BLACK
y.color == BLACK
z.p.p.color == RED
z = z.p.p
else
if z == z.p.right
z = z.p
LEFT-ROTATE(T,x)
z.p.color = BLACK
z.p.p.color = RED
RIGHT-ROTATE(T,z.p.p)
else(same as then clause with "right" and "left" exchanged)
T.root.color = BLACK
13.4 删除
RB-DELETE总共花费 O(lgn) 时间
RB-TRANSPLANT(t,u,v)
if u.p == T.nil
T.root = v
elseif u == u.p.left
u.p.left = v
else u.p.right = v
v.p = u.p
RB-DELETE(T,z)
y = z
y-original-color = y.color
if z.left == T.nil
x = z.right
RB-TRANSPLANT(T,z,x)
elseif z.right == T.nil
x = z.left
RB-TRANSPLANT(T,z,x)
else y = TREE-MINIMUM(z.right)
y-original-color = y.color
x = y.right
if y.p == z
x.p = y
else
RB-TRANSPLANT(T,y,x)
y.right = z.right
z.right.p = y
RB-TRANSPLANT(T,z,y)
y.left = z.left
y.left.p = y
y.color = z.color
if y-original-color == BLACK
RB-DELETE-FIXUP(T,x)
RB-DELETE-FIXUP(T,x)
while x != T.root && x.color == BLACK
if x == x.p.left
w = x.p.right
if w.color == RED
w.color = BLACK
x.p.color = RED
LEFT_ROTATE(T,x.p)
w = x.p.right
if w.left.color == BLACK && w.right.color == BLACK
w.color = RED
x = x.p
else
if w.right.color == BLACK
w.left.color = BLACK
w.color = RED
RIGHT-ROTATE(T,w)
w = x.p.right
w.color = x.p.color
x.p.color = BLACK
w.right.color = BLACK
LEFT_ROTATE(T,x.p)
x = T.root
else(same as then clause with "right" and "left" exchanged)
T.root.color = BLACK