为什么我的代码中出现分段错误?

Why am I getting Segmentation fault in my code?

    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;
    }
    
       

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

在这部分

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

root->left == NULL为真时,执行root=root->right;
由于前面的 if 语句的条件,root->right 在这里然后是 NULL root 设置为 NULL
然后,计算 root->right==NULL 并取消引用 root (NULL)。 这将导致分段错误。

要修复,当root->left!=NULL时第二个条件总是为真,所以应该将其替换为else并让它只执行其中一个。

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