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