用二叉树实现对表达式的表示。如输入中缀表达式(即中根遍历序列)3+7*(4-2),存放在二叉树里。再实现对表达式的求值,输出计算结果。C语言实现
时间: 2024-02-25 12:58:13 浏览: 92
以下是用二叉树实现对表达式的表示和求值的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
Node *create_node(char data) {
Node *node = (Node*) malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
Node *create_expression_tree(char *expression) {
Node *stack[100] = { NULL };
int top = -1;
for (int i = 0; expression[i] != '\0'; i++) {
if (isdigit(expression[i])) {
Node *node = create_node(expression[i]);
stack[++top] = node;
} else {
Node *node = create_node(expression[i]);
node->right = stack[top--];
node->left = stack[top--];
stack[++top] = node;
}
}
return stack[top];
}
int evaluate_expression_tree(Node *node) {
if (isdigit(node->data)) {
return node->data - '0';
} else {
int left_value = evaluate_expression_tree(node->left);
int right_value = evaluate_expression_tree(node->right);
switch(node->data) {
case '+':
return left_value + right_value;
case '-':
return left_value - right_value;
case '*':
return left_value * right_value;
case '/':
return left_value / right_value;
}
}
return 0;
}
int main() {
char expression[] = "3+7*(4-2)";
Node *root = create_expression_tree(expression);
printf("Expression: %s\n", expression);
printf("Result: %d\n", evaluate_expression_tree(root));
return 0;
}
```
首先是定义了一个结构体 `Node` 用于表示二叉树的节点,包括节点的值和左右子节点。然后定义了两个函数 `create_node` 和 `create_expression_tree`,前者用于创建一个节点,后者用于根据中缀表达式构建二叉树。具体实现过程如下:
- 遍历中缀表达式的每一个字符,如果是数字则创建一个节点,并将其压入栈中。
- 如果是运算符,则创建一个节点,并将栈顶的两个节点弹出来作为该节点的左右子节点,然后将该节点压入栈中。
- 最后,栈顶元素即为整个表达式的根节点,返回即可。
最后定义一个函数 `evaluate_expression_tree` 用于计算表达式的值。如果节点的值是数字,则直接返回该数字;如果是运算符,则递归计算左右子节点的值,并根据运算符进行计算,最后返回计算结果。
在 `main` 函数中,调用 `create_expression_tree` 创建二叉树,然后调用 `evaluate_expression_tree` 计算表达式的值,输出即可。
阅读全文