Exemplo n.º 1
0
void rbt_inorder(rbtree_t * T,void (*visit)(rbnode_t *))
{
    rbnode_t *x;
    x = T->root;
    if (x != &T->nil) {
        x = rbt_min(T,x);
        while (x != 0) {
            visit(x);
            x = rbt_successor(T,x);
        }
    }
    return ;
}
Exemplo n.º 2
0
rb_node_t * rbt_suc(rb_node_t * z)
{
	if(z == NIL_NODE){
		return NIL_NODE;
	}

	if(r(z) != NIL_NODE){
		return rbt_min(r(z));
	}

	rb_node_t *x = z;
	while(p(x) != NIL_NODE && x == r(p(x))){
		x = p(x);
	}
	return p(x);
}
Exemplo n.º 3
0
rbnode_t * rbt_successor(rbtree_t *T,rbnode_t *x)
{
    rbnode_t *y;
    if (x->r != &T->nil) {
        y = rbt_min(T,x->r);
    } else {
        y = x->p;
        while ((y != &T->nil) && (y->r == x)) {
            x = y;
            y = x->p;
        }
        if (y == &T->nil) {
            y = 0;
        }
    }
    return y;
}
Exemplo n.º 4
0
int rbt_remove(rbtree_t *T,rbnode_t *z)
{
    int c;
    rbnode_t *x;
    do {
        rbnode_t * y;
        c = z->c;
        if (z->r == &T->nil) {
            x = z->l;
            _rbt_transplant(T,z,z->l);
            x->p = z->p;        /*if x is nil*/
            break;
        }
        y = rbt_min(T,z->r);
        c = y->c;
        y->c = z->c;
        x = y->r;
        if (y != z->r) {
            _rbt_transplant(T,y,y->r);
            x->p = y->p;        /*if x is nil*/
            y->r = z->r;
            y->r->p = y;
        } else {
            x->p = y;           /*if x is nil*/
        }
        _rbt_transplant(T,z,y);
        y->l = z->l;
        if (z->l != &T->nil) {
            z->l->p = y;
        }
    } while (0);

    if ((c == RBT_BLACK )&&(x->c == RBT_BLACK)) {
        _rbt_remove_fixup(T,x);
    } else {
        x->c = RBT_BLACK;
    }
    return 0;
}