//
// Binary Tree Remove algorith
//

remove (data, node &*root)
{
    if (root == 0)
        return;

    if (data < root->data)
        remove (data, root->left)
    else if (data > root->data)
        remove (data, root->right)
    else
    {
        if (root->left != 0 && root->right != 0)
        {
            node *temp = FindMin (root->right)
            root->data = temp->data
            remove (temp->data, root->right)
        }
        else if (root->left == 0 && root->right == 0)
        {
            delete root
            root = 0
        }
        else
        {
            node *temp = root

            if (root->left != 0)
                root = root->left
            else
                root = root->right

            delete temp
        }
    }
}

//
// Binary Tree FindMin algorithm
//

node *FindMin (node *root)
{
    if (root->left == 0)
        return root

    return FindMin (root->left)
}