从二进制搜索树中删除?

时间:2013-10-19 06:42:43

标签: c++ binary-search-tree

我正在尝试从二叉搜索树中删除并在调试器中不断收到此错误 我不知道该怎么做才能纠正它。这段代码是否正确?

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

中的0x00007fff8cc17fe2
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;            
    }     
}

1 个答案:

答案 0 :(得分:1)

首先,使用调试设置进行编译,然后在调试器下运行。我可以全部但保证它会在你的失败案例中完全

就此而言,我推测是这一行:

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

出于某种原因,您之前的逻辑会扣除以下内容:

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

左侧和右侧为空时,您不会考虑这种情况,例如树叶节点中的情况。因此,这取决于你的其他条件:

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

对于叶节点,将t设置为null,这将立即被此答案开头的代码取消引用。

您需要为此修改逻辑,如果取消引用之前的代码可能使指针被解除引用无效,则需要先检查

最后,如果您想知道提示行是什么提示,则获取报告字符串比较的特定错误是取消引用null ptr。除非通过operator <重载,否则不会在此函数的任何其他位置进行字符串比较。