C++ 为什么我的代码中出现了分段错误? Node*findMax(Node*root){ Node*m=根; 而(m!=NULL&&m->right!=NULL){ m=m->右; } 返回m; } //返回删除值为X的节点后修改的BST的根 节点*删除节点(节点*根,int X) { 节点*温度; 如果(!root)返回NULL; 否则,如果(扩展数据)根->左=删除节点(根->左,X); 否则如果(X>根->数据)根->右=删除节点(根->右,X); else if(X==根->数据){ //发现的数据 如果(root->left&&root->right){//要删除的内部节点 temp=findMax(根->左);//顺序前置 root->data=temp->data;//替换为顺序前置 root->left=deleteNode(root->left,root->data);//删除左子树中的重复左 } else{//要删除的节点是叶节点或有一个子节点 温度=根; 如果(根->左==NULL){ 根=根->右; } 如果(根->右==NULL){ 根=根->左; } 免费(临时); } } 返回根; }

C++ 为什么我的代码中出现了分段错误? Node*findMax(Node*root){ Node*m=根; 而(m!=NULL&&m->right!=NULL){ m=m->右; } 返回m; } //返回删除值为X的节点后修改的BST的根 节点*删除节点(节点*根,int X) { 节点*温度; 如果(!root)返回NULL; 否则,如果(扩展数据)根->左=删除节点(根->左,X); 否则如果(X>根->数据)根->右=删除节点(根->右,X); else if(X==根->数据){ //发现的数据 如果(root->left&&root->right){//要删除的内部节点 temp=findMax(根->左);//顺序前置 root->data=temp->data;//替换为顺序前置 root->left=deleteNode(root->left,root->data);//删除左子树中的重复左 } else{//要删除的节点是叶节点或有一个子节点 温度=根; 如果(根->左==NULL){ 根=根->右; } 如果(根->右==NULL){ 根=根->左; } 免费(临时); } } 返回根; },c++,data-structures,segmentation-fault,binary-search-tree,C++,Data Structures,Segmentation Fault,Binary Search Tree,我找不到这段代码中的错误:为什么它会抛出分段错误?在这部分中 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 de

我找不到这段代码中的错误:为什么它会抛出分段错误?

在这部分中

    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;
    }
    
       
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;
                }
                if(root->right==NULL){         
                    root=root->left;
                }

记住
免费(temp)在释放后不会将
temp
root
设置为
NULL
。您是否尝试先调试?非常感谢,这很有效。我差点错过了那部分。
                if(root->left==NULL){  
                    root=root->right;
                }
                else{         
                    root=root->left;
                }