繁体   English   中英

从二叉搜索树中删除?

[英]Deleting from a Binary Search Tree?

我正在尝试从二叉搜索树中删除,并在调试器中不断收到此错误,并且不确定如何纠正它。 此代码正确吗?

程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:在地址:0x0000000000000000 0x00007fff8cc17fe2在std :: string :: compare()中的KERN_INVALID_ADDRESS

void remove( const Comparable & x, BinaryNode *& t )
{
    if (t != NULL)
    {
        if(t->element.find(x) != std::string::npos)
        {
            if( t->left != NULL && t->right != NULL ) // Two children
            {
                t->element = findMin( t->right )->element;
                remove( t->element, t->right);
            }
            else
            {
                BinaryNode *oldNode = t;
                t = ( t->left != NULL ) ? t->left : t->right;
                delete oldNode;
                cout << "Successly deleted!" << endl;
            }
        }
        if(x < t->element)
        {
            remove(x, t->left);
        }
        else
        {
            remove(x, t->right);
        }
    }
    else 
    {
        cout << x << "<-could not delete?" << endl;            
    }     
}

首先,使用调试设置进行编译,然后在调试器下运行它 我可以保证一切,但它会完全解决您失败案例的位置。

关于这一点,我推测这是这一行:

if(x < t->element)  // <==== here
{
    remove(x, t->left);
}
else
{
    remove(x, t->right);
}

由于某种原因,在此之前您的逻辑需要进行以下推导:

  • 左边或右边都不为空
  • 仅左或右为空

你不解释的情况下,当 ,右都为空,如将是一个树的叶节点的情况。 因此,这取自您的else条件:

BinaryNode *oldNode = t;
t = ( t->left != NULL ) ? t->left : t->right;
delete oldNode;
cout << "Successly deleted!" << endl;

如果是叶节点,则将t设置为null,此代码将在此答案的开头立即将其取消引用。

您需要为此重新设计逻辑,并且如果取消引用之前的代码可以使被取消引用的指针无效,则需要首先对其进行检查。

最后,如果您想知道那是有问题的行的提示,则您得到报告字符串比较的特定错误是取消引用空ptr。 除了通过该operator <重载,字符串比较不会在此函数的其他任何地方进行。

暂无
暂无

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

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