编程实现利用二叉树求解表达式的值c语言代码实现
时间: 2024-11-16 19:20:44 浏览: 0
在C语言中,我们可以使用递归的方式来构建一个二叉树,然后对每个节点进行操作来计算数学表达式的值。这里我们假设二叉树代表了一个中缀表达式,其中左孩子代表乘法(*),右孩子代表加减(+/-)。以下是一个简单的中缀转后缀(逆波兰表示法,也称 postfix notation)的转换函数,之后再求值。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 转换函数,将中缀表达式转化为后缀表达式
void infixToPostfix(char *infix, char postfix[], int index) {
stack<char> s;
for (int i = 0; infix[i]; i++) {
if (isdigit(infix[i])) {
postfix[index++] = infix[i];
} else if (infix[i] == '(' || infix[i] == '*') {
s.push(infix[i]);
} else if (infix[i] == ')' || infix[i] == '+') {
while (!s.empty() && (s.top() != '(' || ((infix[i] == '+' && s.top() == '*') || (infix[i] == '-' && s.top() == '*')))) {
postfix[index++] = s.pop();
}
s.pop(); // 出栈左括号
}
}
while (!s.empty()) {
postfix[index++] = s.pop();
}
postfix[index] = '\0'; // 结束标志
}
// 树节点求值
int evaluate(TreeNode *node, double (*evaluator)(double, double)) {
if (node->left == NULL && node->right == NULL) {
return evaluator(node->val, 0); // 叶子节点直接返回值
} else {
return evaluator(evaluate(node->left, evaluator), evaluate(node->right, evaluator));
}
}
int main() {
char infix[] = "2*3+4";
char postfix[100];
int index = 0;
infixToPostfix(infix, postfix, index);
printf("Postfix expression: %s\n", postfix);
TreeNode *root = parsePostfix(postfix); // 这里需要实现从后缀表达式构造二叉树的函数
double result = evaluate(root, /* your custom evaluator function */ add);
printf("Result: %.2f\n", result);
return 0;
}
```
注意,这个示例没有包含完整的从后缀表达式构造二叉树的`parsePostfix`函数。你需要实现这个函数,通常是通过栈来完成的。同时,这里的`add`是一个假设的双数相加的评估器,实际应用中需要替换为你想要处理的运算符对应的函数,如`add`, `subtract`, `multiply`, 等等。
阅读全文