You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:07:45