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;
}