输入简单算术表达式,利用二叉树来表示,并在创建表达式树后求表达式的值。 用二叉树每个结点代表一个运算符或运算数,简单数学表达式中只包含"+、、、/"和一位正整数且格式正确。 根据形如“1+2*3-4/5”的字 符串代表的表达式,构造出对应的二叉树 并计算出表达式的值。 可用二叉链表表示,通过遍历实现。用c语言实现,每一行的代码加上注释。
时间: 2024-01-22 20:19:01 浏览: 95
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
char data; // 存储运算符或运算数
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode, *PtrToNode;
// 创建二叉树(递归实现)
PtrToNode createBinaryTree() {
char c;
scanf("%c", &c);
if (c == ' ') { // 如果是空格,返回 NULL
return NULL;
}
// 分配结点空间,并存储数据
PtrToNode node = (PtrToNode) malloc(sizeof(TreeNode));
node->data = c;
// 递归创建左右子树
node->left = createBinaryTree();
node->right = createBinaryTree();
return node;
}
// 计算二叉树中表达式的值(递归实现)
int calculate(PtrToNode root) {
if (root->left == NULL && root->right == NULL) { // 如果是叶子结点(即运算数),返回该数值
return root->data - '0'; // 将字符转成数字
}
// 递归计算左右子树的值,并根据运算符计算父结点的值
int left = calculate(root->left);
int right = calculate(root->right);
switch (root->data) {
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
case '/':
return left / right;
default:
return 0;
}
}
int main() {
printf("请输入表达式,以回车结束:\n");
PtrToNode root = createBinaryTree(); // 创建表达式二叉树
printf("该表达式的计算结果为:%d\n", calculate(root)); // 计算表达式的值
return 0;
}
```
阅读全文