利用二叉树求解表达式的值
时间: 2024-01-03 22:05:19 浏览: 57
要利用二叉树求解表达式的值,我们可以使用二叉树的后序遍历算法来实现。具体步骤如下:
1. 对表达式进行中缀转后缀,得到后缀表达式。
2. 利用后缀表达式构建二叉树,每个节点表示一个操作符或操作数。
3. 对二叉树进行后序遍历,遍历到操作符时,从栈中弹出两个操作数进行计算,并将计算结果压入栈中。遍历结束后,栈中剩下的就是表达式的最终值。
下面是一个示例代码实现:
```
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
// 定义二叉树节点
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
// 中缀表达式转后缀表达式
vector<char> infixToSuffix(string& s) {
vector<char> res;
stack<char> stk;
for (char c : s) {
if (isdigit(c)) {
res.push_back(c);
} else if (c == '(') {
stk.push(c);
} else if (c == ')') {
while (stk.top() != '(') {
res.push_back(stk.top());
stk.pop();
}
stk.pop();
} else {
while (!stk.empty() && stk.top() != '(' && ((c == '+' || c == '-') && (stk.top() == '+' || stk.top() == '-') || (c == '*' || c == '/'))) {
res.push_back(stk.top());
stk.pop();
}
stk.push(c);
}
}
while (!stk.empty()) {
res.push_back(stk.top());
stk.pop();
}
return res;
}
// 根据后缀表达式构建二叉树
TreeNode* buildTree(vector<char>& postfix) {
stack<TreeNode*> stk;
for (char c : postfix) {
if (isdigit(c)) {
stk.push(new TreeNode(c));
} else {
TreeNode* node = new TreeNode(c);
node->right = stk.top();
stk.pop();
node->left = stk.top();
stk.pop();
stk.push(node);
}
}
return stk.top();
}
// 后序遍历二叉树并计算表达式的值
int evaluate(TreeNode* root) {
if (!root) return 0;
if (isdigit(root->val)) return root->val - '0';
int left = evaluate(root->left);
int right = evaluate(root->right);
if (root->val == '+') return left + right;
if (root->val == '-') return left - right;
if (root->val == '*') return left * right;
if (root->val == '/') return left / right;
return 0;
}
int main() {
string s = "3+2*4-8/2";
vector<char> postfix = infixToSuffix(s);
TreeNode* root = buildTree(postfix);
int res = evaluate(root);
cout << res << endl; // 输出结果为 7
return 0;
}
```
注意,这里只考虑了表达式中只包含加减乘除四种基本操作符的情况,如果表达式中还包含其他操作符,需要相应地修改代码实现。
阅读全文