rb_node_t * rbt_pre(rb_node_t * z) { if(z == NIL_NODE){ return z; } if(l(z) != NIL_NODE){ return rbt_max(l(z)); } rb_node_t *x = z; while(p(x) != NIL_NODE && x == l(p(x))){ x = p(x); } return p(x); }
rbnode_t * rbt_predecessor(rbtree_t *T,rbnode_t *x) { rbnode_t *y; if (x->l != &T->nil) { y = rbt_max(T,x->l); } else { y = x->p; while ((y != &T->nil) && (y->l == x)) { x = y; y = x->p; } if (y == &T->nil) { y = 0; } } return y; }