【笔记】
// 基本没搞懂
NODE* rbDelete(NODE *z) {
NODE *y, *x;
if (z->l == nil || z->r == nil) { y = z; }
else { y = treeSuccessor(z); }
if (y->l != nil) { x = y->l; }
else { x = y->r; }
x->p = y->p;
if (y->p == nil) { root = x; }
else {
if (y == y->p->l) { y->p->l = x; }
else { y->p->r = x; }
}
if (y != z) {
z->key = y->key;
// copy y's satellite data into z
}
if (y->c == BLACK) { rbDeleteFixup(x); }
return y;
}
void rbDeleteFixup(NODE *x) {
NODE *w;
while (x != root && x->c == BLACK) {
if (x == x->p->l) {// x 为左儿子
w = x->p->r;// w 是