使用c语言通过二叉链表求根据字符串代表的表达式,构造出对应的二叉树,并计算出表达式的值,并写出清楚明了的代码注释。
时间: 2023-12-03 14:43:54 浏览: 65
以下是使用C语言通过二叉链表求根据字符串代表的表达式,构造出对应的二叉树,并计算出表达式的值的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node, *pNode;
// 建立二叉树
pNode create_tree(char *str, int *index) {
if (str[*index] == '\0') {
return NULL;
}
pNode root = (pNode)malloc(sizeof(Node));
root->data = str[*index];
root->left = NULL;
root->right = NULL;
(*index)++;
if (isdigit(str[*index])) {
root->left = create_tree(str, index);
}
if (isdigit(str[*index])) {
root->right = create_tree(str, index);
}
return root;
}
// 计算表达式的值
int evaluate(pNode root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return root->data - '0';
}
int left_value = evaluate(root->left);
int right_value = evaluate(root->right);
switch (root->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;
default:
return 0;
}
}
int main() {
char str[] = "3+4*5";
int index = 0;
pNode root = create_tree(str, &index);
int result = evaluate(root);
printf("%s = %d\n", str, result);
return 0;
}
```
代码注释:
1. 定义二叉树的节点结构体,包括节点值和左右子节点指针。
```c
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node, *pNode;
```
2. 建立二叉树的函数,根据字符串表示的表达式构造二叉树。
```c
pNode create_tree(char *str, int *index) {
if (str[*index] == '\0') {
return NULL;
}
pNode root = (pNode)malloc(sizeof(Node));
root->data = str[*index];
root->left = NULL;
root->right = NULL;
(*index)++;
if (isdigit(str[*index])) {
root->left = create_tree(str, index);
}
if (isdigit(str[*index])) {
root->right = create_tree(str, index);
}
return root;
}
```
函数中,若当前字符为结束符,则返回 NULL。否则,新建一个二叉树节点,将当前字符作为节点值,左右子节点指针初始化为空。接着,将索引加 1,判断下一个字符是否为数字,如果是,则递归调用 create_tree 函数,将返回值作为当前节点的左子节点;接着,再次判断下一个字符是否为数字,如果是,则递归调用 create_tree 函数,将返回值作为当前节点的右子节点。最后,返回根节点。
3. 计算表达式的函数,遍历二叉树并计算表达式的值。
```c
int evaluate(pNode root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return root->data - '0';
}
int left_value = evaluate(root->left);
int right_value = evaluate(root->right);
switch (root->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;
default:
return 0;
}
}
```
函数中,若当前节点为空,则返回 0。若当前节点为叶子节点,则返回节点值减去字符 '0' 的结果,即当前节点的值。否则,递归计算左子树和右子树的值,并根据当前节点的操作符计算表达式的值,最后返回计算结果。
4. 主函数,测试代码。
```c
int main() {
char str[] = "3+4*5";
int index = 0;
pNode root = create_tree(str, &index);
int result = evaluate(root);
printf("%s = %d\n", str, result);
return 0;
}
```
主函数中,定义字符串表示的表达式,调用 create_tree 函数建立二叉树,调用 evaluate 函数计算表达式的值,最后输出计算结果。
以上就是使用C语言通过二叉链表求根据字符串代表的表达式,构造出对应的二叉树,并计算出表达式的值的完整代码。
阅读全文