红黑树
红黑树的性质
- 每个节点或是红色的,或是黑色的。
- 根节点是黑色的。
- 每个叶节点(NIL)是黑色的。
- 如果一个节点是红色的,则它的两个子节点都是黑色的。
- 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
一颗有n个内部节点的红黑树的高度至多为2lg(n+1)。
旋转
左旋和右旋
LEFT-ROTATE(T, x):
y = x.right
x.right = y.left
if y.left != T.nil
y.left.p = x
y.p = 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
插入
RB-INSERT(T, z):
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
else if 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, z)
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