题目
编写一个程序,先用二叉树来表示一个简单算术表达式,树的每一个结点包括一个运算符或运算数。在简单算术表达式中只包含+、-、*、/和一位正整数且格式正确**(不包括括号)**,并且要按照先乘除后加减的原则构造二叉树,图7.34所示为1+2*3-4/5代数表达式对应的二叉树,然后由对应的二叉树计算该表达式的值。

分析
如上图所示的二叉树,就表示表达式1+2*3-4/5,如果我们需要计算他,就需要采用前序遍历的方法。

建树
如下图所示是随便构造的一颗二叉树

他表示的是表达式:5 + 2 - 1 * 2 / 5 + 3 + 2* 3
从图中可以发现:
- 所有的叶子节点都必须是数字。
- 所有的非叶子节点都是符号,而且都必须有左子树和右子树。
- 不可能会存在一个节点仅存在左子树而不存在右子树,或者仅存在右子树而不存在左子树的情况。
+-节点只存在于最左边,左孩子只能是+-或者数字,右孩子只能是*/或者数字*/节点的右孩子只能是数字,左孩子只能是*/或者数字
第1 2 3条非常好理解,主要是第4条和第5条
第4条:因为我们计算的时候是采用前序遍历,前序遍历的顺序是自身、左子树、右子树,那么递归返回的顺序是右子树、左子树,乘法和除法的优先级高,所以必须要先算完乘除再算加减,所以加减号要放在左边
第5条:举个反例:

这个树表示1 / (2 * 5),而我们的表达式是不带括号的。
建树方法:从右往左扫描字符串,优先寻找+ -,如果不存在+ - 则寻找* /,如果都不存在,说明这是一个叶子节点。一旦寻找到了符号,都会利用该符号之前的子串来递归构建左子树,右边的子串会用来递归构建右子树。
代码
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v){
this->val = v;
this->left = NULL;
this->right = NULL;
}
TreeNode(char v,TreeNode* l,TreeNode *r){
this->val = v;
this->left = l;
this->right = r;
}
};
/*
string字符串转换成Int类型
*/
int stringToInt(string s){
<

本文介绍了一种使用二叉树结构表示并计算简单算术表达式的方法。通过从右到左扫描表达式,优先寻找加减运算符,若不存在则寻找乘除运算符的方式构建二叉树。文章提供了完整的C++实现代码,包括树的创建、计算及销毁过程。
5459

被折叠的 条评论
为什么被折叠?



