static void rbt_delete_node(rbt_t* tree, rbt_node_t* node){ rbt_node_t* descendant = NULL; if(node->left && node->right){ descendant = rightmost_descendant(node->left); mem_retain(descendant); rbt_delete_node(tree, descendant); if(node->left) node->left->parent = descendant; if(node->right) node->right->parent = descendant; descendant->left = node->left; descendant->right = node->right; descendant->color = node->color; }else if(BLACK == rbt_node_color(node)){ //black node with at most one non-leaf child if(RED == rbt_node_color(node->left) || RED == rbt_node_color(node->right)){ descendant = node->left ? node->left : node->right; descendant->color = BLACK; } else { rbt_del_rebalance(tree, node); } } rbt_node_replace(tree, node, descendant); node->left = NULL; node->right = NULL; node->parent = NULL; mem_release(node); }
int main() { // 测试方法: // 插入10个元素,遍历该元素,打印 int i; prbtree root; nil =(prbtree)malloc(sizeof(rbtree)); nil->color = BLACK; root = nil; int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int length = sizeof(array)/sizeof(int); /* srand(GetTickCount()); */ randomize_in_place(array, length); print_array(array, length); fflush(stdout); for (i = 0; i < length; i++) { prbtree y = (prbtree)malloc(sizeof(rbt_node)); construct_node(y, array[i]); // print_node(y); root = rbt_insert_node(root, y); printf ("the %dth iteration\n",i + 1); mid_traverse_node(root); /* print_node(root); */ /* printf("%x\n", (unsigned int)root); */ } // mid_traverse_node(root); // 测试删除操作 randomize_in_place(array, length); print_array(array, length); fflush(stdout); for (i = 0; i < length; ++i) { prbt_node x = rbt_search(root, array[i]); root = rbt_delete_node(root, x); printf ("the number %d deleted\n",array[i]); printf ("the %dth iteration\n",i + 1); mid_traverse_node(root); } return 0; }
void rbt_delete(rbt_t* tree, void* value){ rbt_node_t* doomed = rbt_lookup(tree, value); if(doomed) rbt_delete_node(tree, doomed); }