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
相关产品推荐
相关产品推荐

