二叉搜索树(BST)删除操作后出现段错误问题求助
BST删除操作段错误的原因及修复
问题1:minVal函数缺少返回值
你的minVal函数在递归分支没有返回递归调用的结果,这会导致函数返回未定义的垃圾值,后续访问tempNode->value时会触发非法内存访问。
修复代码:
treeNode *minVal(treeNode *root) { if(root == NULL || root->left==NULL) return root; else return minVal(root->left); // 必须返回递归结果 }
问题2:递归删除子节点时未更新父节点指针
在deleteBST函数中,当目标值在左/右子树时,你调用了递归删除,但没有把递归返回的新子树根节点赋值给root->left或root->right。这会导致修改后的子树没有被正确挂载回原树,原指针可能指向已释放的内存,引发段错误。
修复代码:
treeNode *deleteBST(treeNode *root,int value) { treeNode *tempNode; // 新增空指针判断,避免访问空节点的value if(root == NULL) return NULL; if(value>root->value) root->right = deleteBST(root->right,value); // 赋值更新右子树 else if(value<root->value) root->left = deleteBST(root->left,value); // 赋值更新左子树 else { if(root->left==NULL) { tempNode = root->right; free(root); return tempNode; } else if(root->right==NULL) { tempNode = root->left; free(root); return tempNode; } else { tempNode = minVal(root->right); root->value=tempNode->value; root->right = deleteBST(root->right,tempNode->value); } } return root; }
内容的提问来源于stack exchange,提问作者Nikhil Raj
相关产品推荐
相关产品推荐

