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

C++实现二叉搜索树时程序仅接收2个输入即终止求助

你的二叉搜索树程序崩溃的原因与修复方案

首先,你遇到的核心问题是空指针解引用:当root初始为NULL时,你直接尝试访问root->cand,这是完全不允许的——NULL指针不指向任何有效的内存区域,直接解引用会触发未定义行为(通常表现为程序崩溃、停止响应,也就是你看到的“仅能接收2个输入就停止”的情况)。

除此之外,你的add函数还有第二个严重问题:当插入非根节点时,你找到了应该插入的位置(temp变为NULL),但你只是创建了新节点并让temp指向它,却没有把这个新节点连接到树的父节点上。这会导致除了根节点外,其他节点都无法被正确添加到树中。

下面是修复后的完整代码,我标注了所有修改的地方:

#include <bits/stdc++.h>
using namespace std;

struct node {
    int cand;
    node *left;
    node *right;
};

class candies {
    node *root;
public:
    candies();
    int add(int);
    int check();
};

candies::candies() {
    root = NULL;
}

int candies::add(int data) {
    if (root == NULL) {
        // 修复点1:先为root分配内存,再赋值
        root = new node;
        root->cand = data;
        root->left = NULL;
        root->right = NULL;
    } else {
        node *temp = root;
        // 修复点2:添加父节点指针,记录当前节点的父节点
        node *parent = NULL;
        // 修复点3:遍历到合适的父节点,而不是直接走到NULL
        while (temp != NULL) {
            parent = temp;
            if (data < temp->cand) {
                temp = temp->left;
            } else {
                temp = temp->right;
            }
        }
        // 创建新节点
        temp = new node;
        temp->cand = data;
        temp->left = temp->right = NULL;
        // 修复点4:把新节点连接到父节点的左或右子树
        if (data < parent->cand) {
            parent->left = temp;
        } else {
            parent->right = temp;
        }
    }
    return 1;
}

int candies::check() {
    node *temp = root;
    int data;
    cin >> data;
    while (temp != NULL) {
        if (temp->cand == data) {
            cout << "YES\n";
            return 1;
        } else if (data < temp->cand) {
            temp = temp->left;
        } else {
            temp = temp->right;
        }
    }
    cout << "NO\n";
    return 0;
}

int main() {
    candies c;
    int n;
    cin >> n;
    while (n--) {
        int data;
        cin >> data;
        c.add(data);
    }
    c.check();
}

关键修复说明:

  1. 空指针解引用修复:当root为NULL时,先通过new node为其分配内存,再对成员变量赋值,避免直接操作空指针。
  2. 节点连接修复:添加parent指针跟踪遍历过程中的父节点,当找到插入位置后,将新节点挂载到父节点的left或right属性上,确保新节点真正被加入到二叉搜索树中。

这样修改后,程序就能正常接收任意数量的输入,并正确构建二叉搜索树,check函数也能正常查询节点了。

内容的提问来源于stack exchange,提问作者hacxter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:08