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

C++ Binary search tree remove segmentation fault

本文关键字:分段 错误 删除 搜索树 二进制 C++      更新时间:2023-10-16

我试图创建一个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;

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

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

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

另外请注意,root是参数的一个非常糟糕的名称,因为它隐藏了类成员变量root,这使得读取起来非常混乱。我建议将其更改为node。例如:

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

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