void rbtree_delete(GtkWidget *darea, rbtree t, int key) { node n = lookup_node(darea, t, key); node child; if (n == NULL) return; if (n->left != NULL && n->right != NULL) { node pred = maximum_node(n->left); n->key = pred->key; n = pred; } child = n->right == NULL ? n->left : n->right; if (node_color(n) == BLACK) { n->color = node_color(child); delete_case1(darea, t, n); } replace_node(t, n, child); if (n->parent == NULL && child != NULL) child->color = BLACK; free(n); }
void rbtree_delete(rbtree t, void* key, compare_func compare) { node child; node n = lookup_node(t, key, compare); if (n == NULL) return; /* Key not found, do nothing */ if (n->left != NULL && n->right != NULL) { /* Copy key/value from predecessor and then delete it instead */ node pred = maximum_node(n->left); n->key = pred->key; n->value = pred->value; n = pred; } assert(n->left == NULL || n->right == NULL); child = n->right == NULL ? n->left : n->right; if (node_color(n) == BLACK) { n->color = node_color(child); delete_case1(t, n); } replace_node(t, n, child); if (n->parent == NULL && child != NULL) child->color = BLACK; free(n); verify_properties(t); }
struct rbtree_node *rbtree_delete(struct rbtree* t, void* key) { struct rbtree_node* child; struct rbtree_node* n = lookup_node(t, key); if (n == NULL) return NULL; /* Key not found, do nothing */ if (n->left != NULL && n->right != NULL) { /* Copy key/data from predecessor and then delete it instead */ struct rbtree_node* pred = maximum_node(n->left); n->key = pred->key; n->data = pred->data; n = pred; } assert(n->left == NULL || n->right == NULL); child = n->right == NULL ? n->left : n->right; if (node_color(n) == BLACK) { n->color = node_color(child); delete_case1(t, n); } replace_node(t, n, child); return n; }
void bbst_delete(bbst tree, void* key, compare_func compare) { node child; node n = lookup_node(tree, key, compare); if (n == NULL) return; if (n->left != NULL && n->right != NULL) { /* find the biggest of the lower */ node predecessor = maximum_node(n->left); n->key = predecessor->key; n->value = predecessor->value; n = predecessor; } assert(n->left == NULL || n->right == NULL); child = n->right == NULL ? n->left : n->right; if (node_color(n) == BLACK) { n->color = node_color(child); delete_case1(tree, n); } replace_node(tree, n, child); if (n->parent == NULL && child != NULL) child->color = BLACK; free(n); }
/* * l_rbtreeDelete() * * Input: t (rbtree, including root node) * key (delete the node with this key) * Return: void */ void l_rbtreeDelete(L_RBTREE *t, RB_TYPE key) { node *n, *child; PROCNAME("l_rbtreeDelete"); if (!t) { L_ERROR("tree is null\n", procName); return; } n = lookup_node(t, key); if (n == NULL) return; /* Key not found, do nothing */ if (n->left != NULL && n->right != NULL) { /* Copy key/value from predecessor and then delete it instead */ node *pred = maximum_node(n->left); n->key = pred->key; n->value = pred->value; n = pred; } /* n->left == NULL || n->right == NULL */ child = n->right == NULL ? n->left : n->right; if (node_color(n) == L_BLACK_NODE) { n->color = node_color(child); delete_case1(t, n); } replace_node(t, n, child); if (n->parent == NULL && child != NULL) /* root should be black */ child->color = L_BLACK_NODE; LEPT_FREE(n); verify_properties(t); }