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