0

remove 関数の最大値を見つけようとすると、プログラムが壊れ続けます。私がやろうとしているのは、ユーザーが削除したいものを左ツリーの最大値で上書きし、代わりにそのノードを削除することです。最初の Else に到達すると、壊れ続けます。再帰は私の心を壊しています。私の欠陥はどこですか?

これは、プライベートな再帰的な兄弟を持つ remove 関数です。

template<typename TYPE>
bool BinarySearchTree<TYPE>::remove(TYPE& data)
{
    bool found = search(dataOut);
    if(found)
        TRoot = Premove(TRoot, data);
    return found;
}

template<typename TYPE>
Node<TYPE>* BinarySearchTree<TYPE>::Premove(Node<TYPE>* root, TYPE& data)
{
    Node<TYPE>* del;
    Node<TYPE>* max;
    if(root)
    {
        if(root->data > data)
            root->left = Premove(root->left, data);
        else if(root->data < data)
            root->right = Premove(root->right, data);
        else
        {
            if(root->left && root->right)
            {
                max = root->left;
                while(max->data < max->right->data)
                    max = max->right;
                root->data = max->data;
                max = Premove(root, max->data);

            }
            else
            {
                del = root;
                root = (root->right) ? root->right : root->left;
                delete pDel;
            }
        }
    }
    return root;
}
4

2 に答える 2