
红黑树的删除过程
如果它的子结点都是空结点,那就用空结点顶替它的位置
如果被删除的结点只有一个子节点,则直接删除这个结点
如果它的双子全为非空,我们就把它的直接后继结点内容复制到它的位置,之后以同样的方式删除它的后继结点,它的后继结点不可能是双子非空,因此此传递过程最多只进行一次。
if left[z] = NIL or right[z] = NIL then y ← z else y ← TREE-SUCCESSOR(z) if left[y] ≠ NIL then x ← left[y] else x ← right[y] if x ≠ NIL then p[x] ← p[y] if p[y] = NIL then root[T] ← x else if y = left[p[y]] then left[p[y]] ← x else right[p[y]] ← x if y ≠ z then key[z] ← key[y] copy y's satellite data into z return y
if left[z] = nil[T] or right[z] = nil[T] then y ← z else y ← TREE-SUCCESSOR(z) if left[y] ≠ nil[T] then x ← left[y] else x ← right[y] p[x] ← p[y] if p[y] = nil[T] then root[T] ← x else if y = left[p[y]] then left[p[y]] ← x else right[p[y]] ← x if y ≠ z then key[z] ← key[y] copy y's satellite data into z if color[y] = BLACK then RB-DELETE-FIXUP(T, x) return y
while x ≠ root[T] and color[x] = BLACK do if x = left[p[x]] then w ← right[p[x]] if color[w] = RED then color[w] ← BLACK ▹ Case 1 color[p[x]] ← RED ▹ Case 1 LEFT-ROTATE(T, p[x]) ▹ Case 1 w ← right[p[x]] ▹ Case 1 if color[left[w]] = BLACK and color[right[w]] = BLACK then color[w] ← RED ▹ Case 2 x ← p[x] ▹ Case 2 else if color[right[w]] = BLACK then color[left[w]] ← BLACK ▹ Case 3 color[w] ← RED ▹ Case 3 RIGHT-ROTATE(T, w) ▹ Case 3 w ← right[p[x]] ▹ Case 3 color[w] ← color[p[x]] ▹ Case 4 color[p[x]] ← BLACK ▹ Case 4 color[right[w]] ← BLACK ▹ Case 4 LEFT-ROTATE(T, p[x]) ▹ Case 4 x ← root[T] ▹ Case 4 else (same as then clause with "right" and "left" exchanged) color[x] ← BLACK
当前结点是红+黑色 解法,直接把当前结点染成黑色,结束此时红黑树性质全部恢复。
当前结点是黑+黑且是根结点, 解法:什么都不做,结束。
删除修复情况1:当前结点是黑+黑且兄弟结点为红色(此时父结点和兄弟结点的子结点分别为黑) ==> 把父结点染成红色,把兄弟结点染成黑色,之后重新进入算法。
删除修复情况2:当前结点是黑加黑且兄弟是黑色且兄弟结点的两个子结点全为黑色
删除修复情况3:当前结点颜色是黑+黑,兄弟结点是黑色,兄弟的左子是红色,右子是黑色
删除修复情况4:当前结点颜色是黑-黑色,它的兄弟结点是黑色,但是兄弟结点的右子是红色,兄弟结点左子的颜色任意
情景1: 当前节点是黑+黑,且兄弟节点为红色(此时父节点和兄弟节点的子节点为黑)
//调用RB-DELETE-FIXUP(T, x) 的1-8行代码while x ≠ root[T] and color[x] = BLACKdo if x = left[p[x]]then w ← right[p[x]]if color[w] = REDthen color[w] ← BLACK ▹ Case 1color[p[x]] ← RED ▹ Case 1LEFT-ROTATE(T, p[x]) ▹ Case 1w ← right[p[x]] ▹ Case 1


删除修复情况2:当前结点是黑加黑且兄弟是黑色且兄弟结点的两个子结点全为黑色。
//调用RB-DELETE-FIXUP(T, x) 的9-11行代码 if color[left[w]] = BLACK and color[right[w]] = BLACK then color[w] ← RED ▹ Case 2 x p[x] ▹ Case 2


删除修复情况3:当前结点颜色是黑+黑,兄弟结点是黑色,兄弟的左子是红色,右子是黑色。
//调用RB-DELETE-FIXUP(T, x) 的第12-16行代码 else if color[right[w]] = BLACK then color[left[w]] ← BLACK ▹ Case 3 color[w] ← RED ▹ Case 3 RIGHT-ROTATE(T, w) ▹ Case 3 w ← right[p[x]] ▹ Case 3


删除修复情况4:当前结点颜色是黑-黑色,它的兄弟结点是黑色,但是兄弟结点的右子是红色,兄弟结点左子的颜色任意。
//调用RB-DELETE-FIXUP(T, x) 的第17-21行代码 color[w] ← color[p[x]] ▹ Case 4 color[p[x]] ← BLACK ▹ Case 4 color[right[w]] ← BLACK ▹ Case 4 LEFT-ROTATE(T, p[x]) ▹ Case 4 x ← root[T] ▹ Case 4


挑战
使用java,c,python,go,dart实现红黑树(持续更新)
长按二维码识别关注
让我知道你在看

文章转载自方家小白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




