首页 > 解决方案 > 为什么我的代码中出现分段错误?

问题描述

    Node* findMax(Node* root){
        Node* m=root;
        while(m!=NULL && m->right!=NULL){
            m=m->right;
        }
        return m;
    }
    // Returns the root of the modified BST after deleting the node with value X
    Node *deleteNode(Node *root,  int X)
    {
        Node *temp;
        if(!root)return NULL;
        else if(X<root->data)root->left=deleteNode(root->left,X);
        else if(X>root->data)root->right=deleteNode(root->right,X);
        else if(X==root->data){
            //data found
            if(root->left && root->right){//internal node to be deleted
                temp=findMax(root->left);//inorder predecessor
                root->data=temp->data;//replace by inorder predecessor
                root->left=deleteNode(root->left,root->data);//delete the duplicate left in left subtree
            }
            else{//node to be deleted is either leaf or has one child
                temp=root;
                if(root->left==NULL){  
                    root=root->right;
                }
                if(root->right==NULL){         
                    root=root->left;
                }
                free(temp);
            }
        }
        return root;
    }
    
       

我找不到这段代码有什么问题:为什么会引发分段错误?

标签: c++data-structuressegmentation-faultbinary-search-tree

解决方案


在这部分

                if(root->left==NULL){  
                    root=root->right;
                }
                if(root->right==NULL){         
                    root=root->left;
                }

root->left == NULL为真时,root=root->right;被执行。
由于先前if语句的条件,root->rightis NULLhere 然后 root设置为NULL
然后,root->right==NULL被评估并且root( NULL) 被取消引用。这将导致分段错误。

要修复,第二个条件将始终为真 when root->left!=NULL,因此应将其替换为else并使其仅执行其中一个。

                if(root->left==NULL){  
                    root=root->right;
                }
                else{         
                    root=root->left;
                }

推荐阅读