将一个不带括号的算术表达式存入二叉树并能够通过遍历求值用C语言
时间: 2023-12-03 11:45:41 浏览: 96
以下是将算术表达式存入二叉树并求值的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 *new_node = (Node*)malloc(sizeof(Node));
new_node->data = data;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
Node* create_expression_tree(char* postfix) {
Node *stack[100];
int top = -1;
for(int i = 0; postfix[i] != '\0'; i++) {
char ch = postfix[i];
if(isdigit(ch)) {
Node *new_node = create_node(ch);
stack[++top] = new_node;
}
else {
Node *new_node = create_node(ch);
new_node->right = stack[top--];
new_node->left = stack[top--];
stack[++top] = new_node;
}
}
return stack[top];
}
int evaluate(Node *root) {
if(root->left == NULL && root->right == NULL) {
return root->data - '0';
}
int left_val = evaluate(root->left);
int right_val = evaluate(root->right);
switch(root->data) {
case '+': return left_val + right_val;
case '-': return left_val - right_val;
case '*': return left_val * right_val;
case '/': return left_val / right_val;
default: return 0;
}
}
int main() {
char postfix[] = "23*4+";
Node *root = create_expression_tree(postfix);
printf("Value of expression: %d", evaluate(root));
return 0;
}
```
上述代码中,首先定义了一个 `Node` 结构体,表示二叉树的节点。`create_node` 函数用于创建一个新的节点。
`create_expression_tree` 函数则是将后缀表达式转换为二叉树的主要函数。在这个函数中,我们使用一个栈来辅助构建二叉树。遍历后缀表达式,如果遇到数字,就创建一个新节点并将其压入栈中。如果遇到运算符,就创建一个新节点,并从栈中弹出两个节点,将它们作为新节点的左右子节点,然后将新节点压入栈中。最终,栈中唯一的元素就是整个二叉树的根节点,我们将其返回。
最后,我们使用 `evaluate` 函数对二叉树进行求值。该函数使用递归的方式遍历整个二叉树,在遍历到叶子节点时,返回节点的值。在遍历到运算符节点时,根据左右子节点的值进行相应的运算。
在 `main` 函数中,我们演示了如何使用这些函数将后缀表达式 "23*4+" 转换为二叉树,并计算出表达式的值。
阅读全文