BST作业insert函数触发段错误(core dumped),求修复方案
搞定BST Insert的Segmentation Fault问题
嘿,我瞅了你的BST作业代码,触发段错误的根源都在find函数上,咱们来逐个解决:
1. 没处理空指针是罪魁祸首
你的非const版本treenode** find一上来就直接访问(*n)->val,但当递归到树的叶子节点之后(也就是*n变成nullptr的时候),解引用空指针直接就炸了——这就是你看到的segmentation fault。毕竟插入新元素时,咱们本来就要找到那个空位置,但你的函数根本没处理这种情况,硬要去读空指针的成员,不崩才怪。
2. 重复定义函数会搞出编译问题
你居然写了两次const treenode* find和两次treenode** find,C++可不允许同一作用域下有签名完全一样的函数重复定义,这先得改了,不然编译都过不了。
3. 条件判断逻辑乱了
比如非constfind里用了(*n)->val<=i和(*n)->val>=i,但前面已经判断过(*n)->val==i了,后面的<=和>=完全多余,还会导致递归方向出错。BST的规则是左小右大,正确的判断应该是:
- 目标值比当前节点小?去左子树找
- 目标值比当前节点大?去右子树找
修复后的完整代码片段
正确的find重载实现
// const版本,用于查找只读节点 const treenode* find(const treenode* n, int i) { if (n == nullptr) return n; // 先检查空指针,避免非法访问 if (n->val == i) return n; else if (n->val > i) return find(n->left, i); // 值更小,往左走 else return find(n->right, i); // 值更大,往右走 } // 非const版本,返回指针的指针,方便后续插入节点 treenode** find(treenode** n, int i) { if (*n == nullptr) return n; // 关键!找到空位置直接返回,这就是插入点 if ((*n)->val == i) return n; else if ((*n)->val > i) return find(&((*n)->left), i); else return find(&((*n)->right), i); }
你的insert函数可以保留,但要依赖上面的正确find
bool set::insert(int i) { treenode** res = find(&tr, i); if (*res == nullptr) { *res = new treenode(i); return true; } return false; }
为啥这样改就好了?
- 加了
*n == nullptr的检查后,递归到插入位置时,函数会返回指向这个空指针的地址,这时insert里的*res就是nullptr,咱们可以安全地创建新节点赋值给它,再也不会触发段错误。 - 删掉重复的函数定义,确保编译顺利通过。
- 修正了条件判断逻辑,严格遵循BST左小右大的规则,避免递归走岔路导致的异常。
内容的提问来源于stack exchange,提问作者xSwampy
相关产品推荐
相关产品推荐

