红黑树的删除操作花费O(lg n)时间,删除算法与二叉搜索树的删除类似,首先红黑树的TRANSPLANT版本有些许不同,主要是因为红黑树使用nil结点代替NULL指针造成的:
RB-TRANSPLANT(T, u, v)
if u.p ==T.nil
T.root= v
else if 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-TRANSPLAN(T, z, z.right)
else if z.right == T.nil
x = z.left
RB-TRANSPLAN(T, z, z.left)
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, y.right)
y.right= z.right
y.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 and x.color == BLACK
if x == x.p. left
w = x.p.right
if w.color == RED
w.color =BLACK // case 1
x.p.color =RED // case 1
LEFT-ROTATE(T,x.p) // case 1
w = x.p.right // case1
if w.left.color ==BLACK and w.right.color == BLACK
w.color= RED //case 2
x= x.p //case 2
else if w.right.color == BLACK
w.left.color = BLACK // case 4
w.color = RED // case 4
RIGHT-ROTATE(T,w) // case 4
w = x.p.right // case 4
w.color = x.p.color // case 3