繁体   English   中英

二叉搜索树递归删除

[英]Binary Search Tree Recursive 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;
}

问题很可能在这里: while(max->data < max->right->data) max = max->right;

你正在用完树( max->right最终将变为NULL)。 实际上,由于它是二叉搜索树,因此无需比较data 只要在可能的情况下向右走就足够了: while (max->right) max=max->right;

另请注意此分支中的最后一个分配:还有两个问题。 首先,代替max = Premove(...)你应该做root->left = Premove(...) (否则你不会修改root-> left引用)。 其次,你应该调用Premove for root->left而不是rootroot->left = Premove(root->left, max->data); (否则你只是获得无限递归)。

我认为你的while语句应该是这样的:

while(max && max->right && max->data < max->right->data ) 

在某些情况下,在代码中, maxmax->right可能为NULL ,并导致run_time错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM