c++ - 为什么我的代码中出现分段错误?
问题描述
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
is NULL
here 然后
root
设置为NULL
。
然后,root->right==NULL
被评估并且root
( NULL
) 被取消引用。这将导致分段错误。
要修复,第二个条件将始终为真 when root->left!=NULL
,因此应将其替换为else
并使其仅执行其中一个。
if(root->left==NULL){
root=root->right;
}
else{
root=root->left;
}
推荐阅读
- timescaledb - SQL 错误 [42883]:错误:timescaleDB 不存在函数 percentile_agg(双精度)
- python - 在具有多个处理程序的记录器中更改处理程序的日志级别
- mysql - (MYSQL) 如果 FK 有 ON UPDATE CASCADE,为什么子行不被更新
- django - Django - 为管理员创建多对多内联对象,类似于 inlinetabular
- .htaccess - 我需要帮助设置 .htaccess
- ruby-on-rails - 没有使用回形针将 Nil 隐式转换为字符串错误
- r - r data.table - 我们可以在新创建的列上使用 shift()
- amazon-web-services - 查找在 AWS CodePipeline 中的提交中更新了哪些文件
- git - 有没有一种简单的方法可以在两个远程仓库之间进行完全同步?
- html - 如何修复 HTML/CSS/JQuery 侧边栏 - 内容应隐藏,直到被选中