C ++二进制搜索树删除分段错误

时间:2016-04-09 02:11:42

标签: c++ segmentation-fault binary-search-tree

我正在尝试创建一个用于删除的bst函数。但是,我正在努力解决这个问题很长时间,但我无法弄清楚导致分段错误的原因。有人可以帮我找一下吗?这是我的代码;

bool Set::remove(const ItemType & item) {   
    return removeHelper(root, item);    
}


bool Set::removeHelper(Node *root, const ItemType &item) {    
    if (root == NULL) {//check if root is null
        return false;
    }
    else if (item == root->data) {//check if item equals to root
        Node *temp = root;  
        if (root->right == NULL && root->left == NULL) {//check if roots equal to null
            root = NULL;
        }   
        else if (root->right == NULL) {//check if root equals to null
            root = root->left;
        }

        else if (root->left == NULL) {//check if root equals to null
            root = root->right;
        }    
        else {
            Node *p = root; //it is like parent root
            temp = temp->right;    
            while (temp->left != NULL) {//check if temp root equals to null
                p = temp;
                temp = p->left;
            }    
            if (p == root) {//check if root equals to parent
                p->right = temp->right;
            }
            else {
                p->left = temp->right;
            }
            root->data = temp->data;
        }
        delete temp;//delete temp node
        return true;
    }    
    else if (item < root->data)
        removeHelper(root->left, item);//call recursive delete function    
    else if (item > root->data)
        removeHelper(root->right, item);//call recursive delete function    
    return false;

1 个答案:

答案 0 :(得分:2)

您的removeHelper函数正在为其root参数分配新值,但这些新值在函数返回时会丢失。如果要更改用于调用removeHelper函数的变量的值,则应通过引用传递它。

bool Set::removeHelper(Node * &root, const ItemType &item) {

然后对节点指针值的更改将反映在调用函数中。

另请注意,root是参数的真正错误名称,因为它隐藏了类成员变量root,这使得阅读非常混乱。我建议将其更改为node。 e.g:

bool Set::removeHelper(Node * &node, const ItemType &item) {

当然,将所有root引用更改为node