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(); }
关键修复说明:
- 空指针解引用修复:当
root为NULL时,先通过new node为其分配内存,再对成员变量赋值,避免直接操作空指针。 - 节点连接修复:添加
parent指针跟踪遍历过程中的父节点,当找到插入位置后,将新节点挂载到父节点的left或right属性上,确保新节点真正被加入到二叉搜索树中。
这样修改后,程序就能正常接收任意数量的输入,并正确构建二叉搜索树,check函数也能正常查询节点了。
内容的提问来源于stack exchange,提问作者hacxter
相关产品推荐
相关产品推荐

