基于二叉树的表达式求值输入一个表达式(表达式中的数均为小于10的正整数),利用二叉树来表示该表达式,创建表达式树,然后利用二叉树的遍历操作求表达式的值。
时间: 2025-03-08 19:12:08 浏览: 55
### 构建表达式树
为了使用二叉树来表示算术表达式,可以采用栈辅助的方法解析中缀表达式并构建相应的二叉树。对于给定的简单算术表达式(仅含加减乘除以及个位数),通过扫描字符串中的每个字符,依据操作符优先级决定何时创建新的分支或者回溯到父节点位置。
当遇到数字时,在当前路径末端添加一个新的叶子节点;而碰到运算符号,则将其作为内部节点连接两个已有的子表达式的根节点[^1]。
```cpp
class TreeNode {
public:
char val;
TreeNode *left, *right;
TreeNode(char x) : val(x), left(NULL), right(NULL){}
};
```
上述代码定义了一个基本的数据结构用于存储单个节点的信息,其中`val`字段保存该处代表的操作数或运算符,指针成员指向左右孩子节点的位置。
### 计算表达式树的结果
一旦完成了从输入串至完全形成的二叉树转换过程之后,就可以利用递归方式轻松地评估整个表达式的数值解:
- 如果访问到了叶节点(即只含有单一整数值的情况),直接返回这个值;
- 否则先分别获取左子树和右子树所对应的实数值,再按照本层根部记录下来的运算符执行相应计算,并最终传递向上一层结果。
下面展示了一种可能实现方案:
```cpp
double evaluate(TreeNode* root){
if (!root->left && !root->right)// leaf node
return (int)(root->val-'0');
double l_val = evaluate(root->left);
double r_val = evaluate(root->right);
switch(root->val){
case '+': return l_val + r_val;
case '-': return l_val - r_val;
case '*': return l_val * r_val;
case '/':
if(r_val==0){cout<<"Error: Division by zero!"<<endl; exit(-1);}
else{return l_val / r_val;}
default: cout << "Invalid operator." << endl;exit(-1);break;
}
}
```
这段函数实现了对已经建立好的表达式树进行求值的功能,它会根据传入参数指定的起始点向下探索直至触及底部最底层的常量项为止。
阅读全文
相关推荐
















