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

C++递归实现表达式树求值代码触发Segmentation Fault段错误求排查

代码段错误触发原因
  • 核心原因:递归逻辑没有区分运算符节点和数字叶子节点的执行路径。所有节点完成左右子树递归后,都会执行两次num栈弹出、一次sign栈弹出的逻辑。对于数字叶子节点,仅会向num栈推入1个整数,不会向sign栈推入任何运算符,连续两次弹出num栈、读取空sign栈的操作都属于非法内存访问,直接触发段错误。
  • 附带逻辑问题:即使修复段错误,代码也会得到错误的计算结果。表达式树中左子树对应左操作数、右子树对应右操作数,代码先弹出的a是右子树结果,后弹出的b是左子树结果,减法、除法运算时操作数顺序写反。
  • 设计冗余问题:表达式树递归求值不需要跨层级共享栈存储,每个节点直接返回当前子树的计算结果即可,更简洁且不容易出错。
修复后代码示例
class Solution
{
public:
    int evalTree(node* root) {
        // 叶子节点是数字,直接返回整数值
        if (root->data != "+" && root->data != "-" && root->data != "*" && root->data != "/") {
            return stoi(root->data);
        }
        // 递归计算左右子树值
        int left = evalTree(root->left);
        int right = evalTree(root->right);
        // 按当前运算符计算结果
        if (root->data == "+") return left + right;
        if (root->data == "-") return left - right;
        if (root->data == "*") return left * right;
        if (root->data == "/") return left / right;
        return 0;
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:24:03