void* rb_tree_delete(tree_root* root, void* key){ tree_node *y, *z, *x, *hold_node_to_delete; uint8_t y_original_color; void* node_to_return; hold_node_to_delete = y = z = __search_rbtree_node(root, key); if(y == NULL){ log(W, "Trying to remove a node from tree that does not exist."); return NULL; } node_to_return = y->node; y_original_color = y->color; if(z->left == &RBNIL){ x = z->right; __rb_transplant(root, z, z->right); } else if(z->right == &RBNIL){ x = z->left; __rb_transplant(root, z, z->left); } else{ y = __rb_tree_minimum(z->right); y_original_color = y->color; x = y->right; if(y->parent == z) x->parent = y; else{ __rb_transplant(root, y, y->right); y->right = z->right; y->right->parent = y; } __rb_transplant(root, z, y); y->left = z->left; y->left->parent = y; y->color = z->color; } if(y_original_color == BLACK) __rb_tree_delete_fixup(root, x); free(hold_node_to_delete); return node_to_return; }
void* search_rbtree(const tree_root* root, const void* key){ tree_node *z = __search_rbtree_node(root, key); if(z) return z->node; return NULL; }
void* search_rbtree(tree_root root, void* key){ tree_node *z = __search_rbtree_node(root, key); if(z) return z->node; return NULL; }