Exemplo n.º 1
0
/* 删除任意值辅助函数 */
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);
		}
	}
}
Exemplo n.º 2
0
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);
  }
}
Exemplo n.º 3
0
/* 删除任意值 */
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;
}
Exemplo n.º 4
0
void           rbtree_delete(rbtree_t *tree)
{
  if (tree->root != tree->sentinel)
    _rbtree_delete(tree, tree->root);
  rbtree_node_delete(tree->sentinel);
}