static void rb_tree_delete(rb_tree_t *tree, rb_tree_node_t *z) { rb_tree_node_t *y = NULL; rb_tree_node_t *x = NULL; if (IS_NIL(tree, z->left) || IS_NIL(tree, z->right)) { y = z; } else { y = rb_tree_successor(tree, z); } if (IS_NIL(tree, y->left)) { x = y->right; } else { x = y->left; } x->parent = y->parent; if (IS_NIL(tree, y->parent)) { tree->head = x; } else { if (y == y->parent->left) { y->parent->left = x; } else { y->parent->right = x; } } if (y != z) { /* z->left = y->left; */ /* z->right = y->right; */ /* z->parent = y->parent; */ /* z->color = y->color; */ z->key = y->key; z->count = y->count; } if (y->color == BLACK) { rb_tree_delete_fixup(tree, x); } free(y); }
void rb_tree_delete (RBTREE *T , NODE *z) { NODE *y = z; NODE *x; int y_original_color = y->color; if (z->left == T->nil) { x = z->right; transplant (T , z , z->right); free (z); }else if (z->right == T->nil) { x = z->right; transplant (T , z , z->left); free (z); }else { y = minimum_rb_tree (T , z->right); y_original_color = y->color; x = y->right; if (y->parent == z) { x->parent = y; transplant (T , z , y); y->left = z->left; z->left->parent = y; y->color = z->color; free (z); }else { transplant (T , y , y->right); y->right = z->right; y->right->parent = y; transplant (T , z , y); y->left = z->left; y->left->parent = y; y->color = z->color; free (z); } } if (y_original_color == BLACK) rb_tree_delete_fixup (T , x); }