标签:
参考《算法导论第三版》
红黑树删除方法比较。
传统方法:
RB-Delete(T, z)
if ((T.Nil == z.left) || (T.Nil == z.right))
y = z
else
y = RB-Min(z.right)
if (T.Nil != y.left)
x = y.left
else
x = y.right
RB-Transplate(y, x)
x.p = y.p
if (z != y)
copy y.data to z.data
if (BLACK == y.color)
RB-Delete-fixup(x)
return;
这种方法在删除有两个子节点的节点Z时,采用复制卫星数据的方式删除Z,其他方式与有序二叉树删除的方式一样。
改版方法:
RB-Delete(T, z)
y = z
y.origincolor = y.color
if (T.Nil == z.left)
x = z.right
RB-Transplate(y, x)
elseif (T.Nil == z.right)
x = z.left
RB-Transplate(y, x)
else
y = RB-Min(x.right)
y.origincolor = y.color
x = y.right
if (y == z.right)
x.p = y
else
RB-Transplate(y, y.right)
y.right = z.right
y.right.p = y
RB-Transplate(z, y)
y.left = z.left
y.left.p = y
y.color = z.color
if (BLACK == y.origincolor)
RB-Delete-fixup(x)
return;
这种方法在删除有两个子节点的节点Z时,找到后继y, 不copy卫星数据而是修改指针,思想如下:如果y正好是Z的right,则只需要修改y的left就好;如果y不是,则先移除y,设置y的right,y的left;
如果卫星数据copy开销很大,则改版方法的优势就体现出来。
标签:
原文地址:http://www.cnblogs.com/BoostQt/p/5873523.html