Beispiel #1
0
void _rb_del_node(struct rb_node *node)
{
	assert(node != NULL);
	struct rb_node *rel_del_ptr;
	if(node->rb_left == NULL || node->rb_right == NULL){
		rel_del_ptr = node;
	}else{
		rel_del_ptr = _find_succ(node);
	}
	struct rb_node *del_child = rel_del_ptr->rb_right ? rel_del_ptr->rb_right : rel_del_ptr->rb_left;//can be null
	if(del_child){
		del_child->rb_parent = rel_del_ptr->rb_parent;
	}

	if(!rel_del_ptr->rb_parent){
		this_rb->root = del_child;
	}else{
		if(rel_del_ptr == rel_del_ptr->rb_parent->rb_right){
			rel_del_ptr->rb_parent->rb_right = del_child;
		}else{
			rel_del_ptr->rb_parent->rb_left = del_child;
		}
	}
	if(rel_del_ptr != node){
		node->key = rel_del_ptr->key;
	}

	if(rel_del_ptr->color){
		//black, fix sth.
		_rb_del_fix(del_child, rel_del_ptr->rb_parent);
	}
	_rb_destroy_node(rel_del_ptr);
}
Beispiel #2
0
/*
 * find all node whose key is in range [MIN, to]
 * return number of nodes.
 * 
 * 
 */
int rb_del_in_range(_key_t to)//[MIN, to]
{
	struct rb_node *min_ptr = _find_min(this_rb->root), *ptr;
	ap_key tmp;
	int num = 0;
	while(min_ptr && min_ptr->key <= to){
		ptr = _find_succ(min_ptr);

		tmp.node_ptr = min_ptr;
		rb_delete(&tmp, DEL_RUNALL_CB);

		min_ptr = ptr;
		num++;
	}
	return num;
}
Beispiel #3
0
static int
_walk_int(struct ptree_node *pn, 
		  ptree_order_t order, 
		  int level,
		  ptree_walk_res_t (*func)(struct ptree_node *, int level, void *, void *),
		  void *arg1, 
		  void *arg2)
{
	ptree_walk_res_t res;
	ptree_node_t *next;

	if (!pn)
		return PTREE_WALK_CONTINUE;

	if (order == PTREE_INORDER)
	{
		int nlevel;

		pn = _find_min(pn, &level);
		while (pn) 
		{
			nlevel = level;
			next = _find_succ(pn, &nlevel);
			if ((res = func(pn, level, arg1, arg2)) != PTREE_WALK_CONTINUE)
				return res;
			level = nlevel;
			if (level < 0)
				level = 0;
			pn = next;
		}
		return PTREE_WALK_CONTINUE;
	}
	if (order == PTREE_PREORDER && (res = func(pn, level, arg1, arg2)) != PTREE_WALK_CONTINUE)
		return res;
	if ((res = _walk_int(pn->pn_left, order, level + 1, func, arg1, arg2)) != PTREE_WALK_CONTINUE)
		return res;
	if ((res = _walk_int(pn->pn_right, order, level + 1, func, arg1, arg2)) != PTREE_WALK_CONTINUE)
		return res;
	if (order == PTREE_POSTORDER && (res = func(pn, level, arg1, arg2)) != PTREE_WALK_CONTINUE)
		return res;
	return PTREE_WALK_CONTINUE;
}