用c语言通过二叉链表遍历输入简单的字符串算术表达式,构造出对应的二叉树,并计算表达式的值,并注释每一行代码,解释为什么要这样写,核心代码是哪一块?
时间: 2024-02-22 11:57:21 浏览: 160
好的,我会尽力回答你的问题。
首先,我们需要定义二叉链表节点的结构体:
```c
typedef struct TreeNode {
char data; // 节点存储的数据,可以是数字或运算符
struct TreeNode *leftChild; // 左子节点
struct TreeNode *rightChild; // 右子节点
} TreeNode, *pTreeNode;
```
其中,`data` 表示节点存储的数据,可以是数字或运算符;`leftChild` 表示左子节点;`rightChild` 表示右子节点。
接下来,我们需要编写遍历输入的字符串表达式的函数,构造出对应的二叉树:
```c
pTreeNode buildTree(char *expr) {
pTreeNode stack[MAX_SIZE]; // 定义一个栈
int top = -1; // 栈顶指针初始化为-1
pTreeNode p, q; // 定义两个指针,p为当前节点,q为栈顶元素
char ch = '\0'; // 存储遍历的当前字符
int i = 0; // 表达式字符串的下标
while ((ch = expr[i++]) != '\0') { // 循环遍历表达式字符串
switch (ch) {
case '(':
// 左括号,将当前节点入栈
stack[++top] = p;
p = NULL;
break;
case ')':
// 右括号,将当前节点赋值给栈顶节点的右子节点
p = stack[top--];
break;
case '+':
case '-':
case '*':
case '/':
// 运算符,创建一个新节点,将栈顶元素作为新节点的左子节点,
// 当前节点作为新节点的右子节点,新节点入栈
q = (pTreeNode)malloc(sizeof(TreeNode));
q->data = ch;
q->leftChild = p;
q->rightChild = NULL;
p = q;
break;
default:
// 数字,创建一个新节点,将当前数字作为新节点的数据,
// 新节点入栈
q = (pTreeNode)malloc(sizeof(TreeNode));
q->data = ch;
q->leftChild = NULL;
q->rightChild = NULL;
p = q;
break;
}
}
return p;
}
```
在遍历表达式字符串的过程中,我们使用了一个栈来辅助构造二叉树。对于遍历到的每个字符,如果是左括号,则将当前节点入栈,并将当前节点置空;如果是右括号,则将当前节点赋值给栈顶元素的右子节点;如果是运算符,则创建一个新节点,将栈顶元素作为新节点的左子节点,当前节点作为新节点的右子节点,然后将新节点入栈;如果是数字,则创建一个新节点,将当前数字作为新节点的数据,然后将新节点入栈。最后,栈中剩余的节点即为构造好的二叉树的根节点。
接下来,我们需要编写计算表达式值的函数:
```c
int calc(pTreeNode root) {
if (root == NULL) { // 如果根节点为空,返回0
return 0;
}
if (root->leftChild == NULL && root->rightChild == NULL) { // 如果当前节点是叶子节点,返回节点存储的数据
return root->data - '0';
}
int leftVal = calc(root->leftChild); // 递归计算左子树的值
int rightVal = calc(root->rightChild); // 递归计算右子树的值
switch (root->data) { // 根据当前节点的运算符,计算左右子树的值,并返回结果
case '+':
return leftVal + rightVal;
case '-':
return leftVal - rightVal;
case '*':
return leftVal * rightVal;
case '/':
return leftVal / rightVal;
default:
return 0;
}
}
```
对于二叉树的每个节点,如果是叶子节点,则直接返回节点存储的数据;如果不是叶子节点,则递归计算左子树和右子树的值,然后根据当前节点存储的运算符,计算左右子树的值,并返回结果。
核心代码是 `buildTree` 和 `calc` 函数,它们分别实现了构造二叉树和计算表达式值的功能。
阅读全文