0

我正在尝试删除特定的节点,但我看不出问题出在哪里。

实际上,我通过 获取节点Find(),然后使用Remove().

Delete()每当触发时,程序就会崩溃。

bool RemoveNode(int key)
{
    if (IsEmpty())
        return false;
    Node* r = Find(key,root);
    if (r==nullptr)
        return false;
    return Remove(r);
}
bool Remove (Node* &r)
{
    if (r->left==nullptr && r->right ==nullptr)
    {
        delete r;
        r=nullptr;
        return true;
    }
    if (r->left==nullptr)
    {
        Node* temp = r->right;
        delete r;
        r=nullptr;
        r=temp;
        return true;
    }
    if (r->right==nullptr)
    {
        Node* temp = r->left;
        delete r;
        r=nullptr;
        r=temp;
        return true;
    }
    Node* Max = FindMax(r->left);
    r->data = Max->data;
    Remove(Max);

    return true;
}
Node* FindMax(Node* r)
{
    if(r->right==nullptr)
        return r;
    return FindMax(r->right);
}
Node* Find(int key, Node* &r)
{
    if (r==nullptr)
        return nullptr;

    if (r->data==key)
        return r;

    if (key < r->data)
        return Find(key,r->left);
    else
        return Find(key,r->right);
}
4

1 回答 1

1

显然,您的Remove()函数旨在修改指向节点的指针,而与它所在的位置无关:您不是传入原始指针,而是传入对指针的引用。这样,您可以更新树的root指针,left或者right作为下一个的组件。只要您在正确的参考中传递它,我认为代码应该可以工作。

该变量r实际上是在Remove()其中定义的局部变量中修改的RemoveNode():结果Find()是一个指针,而不是对相关指针的引用。但是,您需要修改树结构中指向节点的指针,而不是任意的局部变量。

解决方法是使用特殊版本的Find()' which correctly returns a reference to the pointer rather than the pointer itself. Your recursiveFind() would be up to the task if it returned aNode*& rather than aNode*`。由于您的树似乎不平衡并且堆栈空间相对有限,因此我宁愿使用非递归函数。它不会返回对指针的引用,而是维护指向当前节点的指针而不是指向节点的指针:

Node** InternFind(int key) {
    Node** n = &this->root;
    while (*n && (*n)->key != key) {
        n = &(key < (*n)->key? (*n)->left: (*n)->right);
    }
    return n;
}

该代码未经测试,可能不太正确。但是,一旦您获得了指向 pinter 的指针,您就可以对其进行更新,而无需处理它的来源:

Node** r = InternFind(key);
if (*r) {
    Remove(*r);
    return true;
}
else {
    return false;
}

虽然我不知道“if Delete()fires”是什么意思,但我假设您在重复使用delete pfor the same pointer时遇到了问题p。代码可能在访问陈旧节点之前很久就出错了。

于 2013-10-29T20:30:57.520 回答