为什么我的代码中出现分段错误?
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;
}
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;
}