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

C++实现类的BST中序遍历返回时触发std::out_of_range异常求助

排查二叉搜索树中序遍历触发的std::out_of_range异常

Hey there! 看到你在实现BST中序遍历时遇到了std::out_of_range异常,而且怀疑是指针问题但找不到根源,我来帮你梳理下可能的原因和排查方向~

可能的异常触发点分析

1. 结果容器的越界访问

你提到函数返回内容时触发异常,大概率是用来存储遍历结果的容器(比如std::vector)被错误地用下标访问了。比如在容器为空时直接用vec[i]赋值,或者遍历索引超出了容器实际大小。

举个典型的错误示例:

vector<int> inorderTraversal(Node* root) {
    vector<int> res;
    // 错误:直接访问空容器的下标位置
    res[0] = root->val; 
    // ... 其他遍历逻辑
    return res;
}

正确的做法是用push_back()或emplace_back()添加元素,避免直接下标操作。

2. 空指针未判空导致的间接错误

如果你的遍历逻辑没有检查节点是否为空,直接访问node->left、node->val这类成员,可能会触发内存访问错误,在某些环境下会被包装成std::out_of_range异常(更常见的是段错误,但不同编译器表现有差异)。

错误的递归遍历示例:

void traverse(Node* node, vector<int>& res) {
    traverse(node->left, res); // 未检查node是否为空
    res.push_back(node->val);
    traverse(node->right, res);
}

正确的逻辑应该先判空:

void traverse(Node* node, vector<int>& res) {
    if (node == nullptr) return; // 先确认节点有效!
    traverse(node->left, res);
    res.push_back(node->val);
    traverse(node->right, res);
}

3. 全局节点的初始化隐患

你提到暂时忽略全局节点的问题,但如果全局节点的左右指针没有被初始化为nullptr,默认会是随机野指针。遍历过程中误把这些野指针当成有效节点访问,也会触发各种内存异常,包括std::out_of_range。

排查步骤建议

  • 先检查容器操作:确认所有添加结果的逻辑都是用push_back(),没有直接下标访问空容器的情况;
  • 给遍历逻辑加空指针检查:在访问任何节点成员前,先判断指针是否为nullptr;
  • 加调试打印:在遍历的每一步打印当前节点的地址和值,看是否访问到了无效内存;
  • 如果是迭代式遍历(非递归),检查栈的入栈出栈逻辑,有没有压入空指针或重复处理无效节点。

参考示例代码

这里给你一个能正常运行的中序遍历实现,你可以对照自己的代码找差异:

#include <iostream>
#include <vector>
using namespace std;

// 全局节点结构(按你的场景保留)
struct Node {
    int val;
    Node* left;
    Node* right;
    Node(int x) : val(x), left(nullptr), right(nullptr) {}
};

Node* root = new Node(5); // 示例根节点

void inorderHelper(Node* node, vector<int>& res) {
    if (!node) return;
    inorderHelper(node->left, res);
    res.push_back(node->val);
    inorderHelper(node->right, res);
}

vector<int> inorderTraversal() {
    vector<int> res;
    inorderHelper(root, res);
    return res;
}

int main() {
    // 构建示例BST
    root->left = new Node(3);
    root->right = new Node(7);
    root->left->left = new Node(2);
    
    vector<int> result = inorderTraversal();
    for (int num : result) {
        cout << num << " "; // 预期输出:2 3 5 7
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:04:23