一、红黑树性质
红黑树是一棵满足下面性质的二叉搜索树
1.每个节点是红色的,或是黑色的。
2.根节点是黑色的。
3.每个叶节点是黑色的。
4.如果一个节点是红色的,则它两个子节点都是黑色的。
5.对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
黑高:从某个节点x出发(不含该节点)到达一个叶节点的任意一条简单路径上的黑色节点个数称为该节点的黑高(black-height),记为bh(x)。
一棵有n个内部节点的红黑树的高度之多为2lg(n+1)。
二、旋转
左转
LEFT-ROTATE(T,x)
y = x.right
x.right = y.left
if y.left != NIL
y.left.p = x
y.p = x.p
if x.p == 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
右转
RIGHT-ROTATE(T,x)
y = x.left
x.left = y.right
if y.right != NIL
y.right.p = x
y.p = x.p
if x.p == NIL
T.root = y
else if x == x.p.left
x.p.left = y
else
x.p.right = y
y.right = x
x.p = y
三、插入
一、父节点z.p是祖父节点z.p.p的左孩子
1、叔叔节点是红色。
处理:将叔叔节点y与父节点z.p置为黑色,将祖父节点z.p.p置为红色,继续循环。
2、叔叔节点是黑色,z是父节点z.p的右孩子。
处理:以父节点z.p为轴,做左旋。
3、叔叔节点是黑色,z是父节点z.p的左孩子。
处理:将父节点z.p置为黑色,祖父节点z.p.p置为红色。以祖父节点z.p.p为轴做右旋。
二、父节点z.p是祖父节点z.p.p的右孩子
1、叔叔节点是红色。
处理:将叔叔节点y与父节点z.p置为黑色,将祖父节点z.p.p置为红色,继续循环。
2、叔叔节点是黑色,z是父节点的左孩子。
处理:以父节点z.p为轴做右旋。
3、叔叔节点是黑色,z是父节点的右孩子。
处理:将父节点z.p置为黑色,祖父节点z.p.p置为红色。以祖父节点为轴做左旋。
插入
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
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.left
z = z.p
RIGHT-ROTATE(T,z)
z.p.color = BLACK
z.p.p.color = RED
LEFT-ROTATE(T,z.p.p)
T.root.color = BLACK