BST代码无输出且触发段错误,请求排查错误原因
二叉搜索树代码段错误/无输出问题排查
你的代码在在线编译器出现段错误、VS Code无输出无报错的核心原因是**insert函数的递归调用参数错误**,导致无限递归触发栈溢出。
问题点分析
在insert方法中,递归插入左/右子树时,你传递的是当前节点newNode而非对应的子节点指针:
// 错误写法:递归传了当前节点newNode,导致无限递归 newNode -> left = insert(newNode, data); newNode -> right = insert(newNode, data);
每次递归都会重复处理同一个节点,永远无法触达空节点的终止条件,最终栈内存耗尽引发段错误;VS Code环境下进程因栈溢出直接终止,所以没有任何输出。
修正后的代码
把递归调用的参数改成对应子节点即可:
#include <iostream> using namespace std; class node { public: int data; node *left, *right; node(int data){ this->data = data; this->left = nullptr; this->right = nullptr; } }; class BST{ public: node* addNode(int data){ return new node(data); } void Inorder(node* root){ if(root == nullptr) return; Inorder(root->left); cout << root->data << "\t"; Inorder(root->right); } node* insert(node* currNode, int data){ if(currNode == nullptr) return addNode(data); if(data < currNode->data) // 递归传递左子节点 currNode->left = insert(currNode->left, data); else if(data > currNode->data) // 递归传递右子节点 currNode->right = insert(currNode->right, data); return currNode; } }; int main(){ node *root = nullptr; BST objbst; root = objbst.insert(root, 8); root = objbst.insert(root, 3); root = objbst.insert(root, 1); root = objbst.insert(root, 6); root = objbst.insert(root, 7); root = objbst.insert(root, 10); root = objbst.insert(root, 14); root = objbst.insert(root, 4); cout << "Inorder traversal: "; objbst.Inorder(root); cout << endl; // 加上换行让输出更整洁 }
额外优化建议
- 用
nullptr替代NULL,这是C++11及以后更规范的空指针写法 - 去掉不必要的
<type_traits>头文件,你的代码未用到该头文件内容 - 主函数末尾添加换行输出,让结果格式更整洁
内容的提问来源于stack exchange,提问作者sniffer
相关产品推荐
相关产品推荐

