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 ; }
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); }
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; }
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; }