node* __find_node_p (node* root, int data, node** parent) { if (!root) return root; if (!root || data == root->data) return root; return data < root->data ? __find_node(root->lchild, data) : __find_node(root->rchild, data); }
bool predecessor(const key_type& key, key_type* p) { rb_tree_node* pos = __find_node(key); if (!__isnil(pos) && !__isnil(pos = __predecessor(pos))) { if (p != nullptr) *p = pos->value.first; return true; } return false; }
bool erase(const key_type& key) { rb_tree_node* pos = __find_node(key); if (__isnil(pos)) return false; rb_erase_result result = __bst_erase(pos); // tree above garbage is legal. if (result.first->color == black) __rb_erase_fixup(result.second); delete result.first; return true; }
bool contains(const key_type& key) const { return !__isnil(__find_node(key)); }
node* find_node(bintree* tree, int data, node** parent) { return __find_node(tree->root, data, parent); }
node* __find_node (node* root, int data) { if (!root || data == root->data) return root; return data < root->data ? __find_node(root->lchild, data) : __find_node(root->rchild, data); }