我也基于this实现,从CLRS章节中的红黑树上复制了伪代码。删除根节点时,我复制的代码无法正常工作(修复前根节点没有更改,我认为这是由于移植错误所致),我不知道为什么。
RBTNode* Custom_Delete(RBTNode* tree, RBTNode* z) {
RBTNode *x, *y;
y = z;
int y_og_color = y->color;
if (z->left == NIL){
x = z->right;
transplant(tree, z, z->right);
} else if (z->right == NIL){
x = z->left;
transplant(tree, z, z->left);
} else {
y = RBTreeMinimim(z->right);
y_og_color = y->color;
x = y->right;
if (y->parent == z){
x->parent = y;
} else {
transplant(tree, y, y->right);
y->right = z->right;
y->right->parent = y;
}
transplant(tree, z, y);
y->left = z->left;
y->left->parent = y;
y->color = z->color;
}
if (y_og_color == BLACK) {
RBTreeDeleteFixUp(tree, x);
}
return y;
}
void transplant(RBTNode* root, RBTNode* u, RBTNode* v)
{
if (u->parent == NIL)
{root = v;}
else if(u == u->parent->left)
{u->parent->left = v;}
else
{u->parent->right = v;}
v->parent = u->parent;
}
答案 0 :(得分:1)
代码本身没有错误,I've just passed root pointer to transplant() incorrectly。应该为void transplant(RBTNode* &root, RBTNode* u, RBTNode* v)
,以便根指针在delete()中被调用后实际上可以更改。