static bs_tree_node_t* delete_node(bs_tree_t* tree, bs_tree_node_t* node, void* key) { int cmp = tree->compare(node->key, key); if(cmp < 0) { if(node->left) delete_node(tree, node->left, key); else return NULL; } else if(cmp > 0) { if(node->right) delete_node(tree, node->right, key); else return NULL; } else { if(node->left && node->right) { bs_tree_node_t* successor = find_min(node->right); swap_nodes(successor, node); replace_node_in_parent(tree, successor, successor->right); return successor; } else if(node->left) replace_node_in_parent(tree, node, node->left); else if(node->right) replace_node_in_parent(tree, node, node->right); else replace_node_in_parent(tree, node, NULL); return node; } }
void BST<T>::erase(iterator itr) { --cnt; if( cnt == 0 ) { delete root; root = nullptr; return; } // if left & right child both exist if( (itr.node)->left && (itr.node)->right ) { TreeNode<T> *predecessor = findMax((itr.node)->left); (itr.node)->val = predecessor->val; erase(iterator(predecessor)); // if only left child exist } else { TreeNode<T> *child = (itr.node)->left ? (itr.node)->left : (itr.node)->right; replace_node_in_parent(itr.node, child); delete itr.node; } }