Example #1
0
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;
	}
}
Example #2
0
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;
    }
}