/* 删除任意值辅助函数 */ rbtree_node _rbtree_delete(rbtree_node h,int key){ if(key < h->key){ if( !is_red(h->left) && !is_red(h->left->left)) h = move_red_left(h); h->left = _rbtree_delete(h->left,key); }else{ if( is_red(h->left) ) h = rotate_right(h); if( key == h->key && h->right == NULL){ free(h); return NULL; } if( !is_red(h->right) && !is_red(h->right->left) ) h = move_red_right(h); if( key == h->key ){ //TODO:获得最小值 rbtree_node x = _rbtree_min(h->right); h->key = x->key; h->val = x->val; h->right = _rbtree_delete_min(h->right); }else{ h->right = _rbtree_delete(h->right,key); } } }
static void _rbtree_delete(rbtree_t *tree, rbtree_node_t *node) { if (node != tree->sentinel) { _rbtree_delete(tree, node->left); _rbtree_delete(tree, node->right); rbtree_node_delete(node); } }
/* 删除任意值 */ int rbtree_delete(rbtree tree,int key){ int *val = rbtree_search(tree,key); if(val==NULL) return 0; rbtree_node root = tree->root; if( !is_red(root->left) && !is_red(root->right) ){ root->color = RED; } root = _rbtree_delete(root,key); if(root != NULL) root->color = BLACK; return 1; }
void rbtree_delete(rbtree_t *tree) { if (tree->root != tree->sentinel) _rbtree_delete(tree, tree->root); rbtree_node_delete(tree->sentinel); }