使用【C语言】写【设计一个使用二叉树实现数学表达式求值的程序,需要完成以下功能: (1)输入一个中缀表达式,建立二叉解析树,并对其进行先序、中序和后序的遍历; (2)利用递归的方法实现二叉解析树的求值功能; 】的代码
时间: 2024-11-09 21:22:21 浏览: 93
24道C语言课设小项目,锻炼代码能力
在C语言中设计一个使用二叉树实现中缀表达式求值的程序,我们需要创建一个二叉树结构,用于存储操作数和运算符。这里是一个简化版的示例,我们首先定义了节点结构,然后实现了基本的二叉树操作,如插入节点、前序、中序和后序遍历以及计算表达式的值。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
typedef struct TreeNode {
char op; // 运算符
double num; // 操作数
struct TreeNode* left, *right;
} TreeNode;
// 插入节点
TreeNode* insertNode(TreeNode** root, char op, double num) {
if (*root == NULL) {
*root = (TreeNode*)malloc(sizeof(TreeNode));
(*root)->op = op;
(*root)->num = num;
(*root)->left = (*root)->right = NULL;
} else if (op == '+') { // 如果是加法,添加到右子树
insertNode(&(*root)->right, op, num);
} else if (op == '-') { // 否则是减法,添加到左子树
insertNode(&(*root)->left, op, num);
}
return *root;
}
// 前序遍历
void preOrderTraversal(TreeNode* node) {
if (node != NULL) {
printf("%g %c", node->num, node->op);
preOrderTraversal(node->left);
preOrderTraversal(node->right);
}
}
// 中序遍历
void inOrderTraversal(TreeNode* node) {
if (node != NULL) {
inOrderTraversal(node->left);
printf("%g %c", node->num, node->op);
inOrderTraversal(node->right);
}
}
// 后序遍历
void postOrderTraversal(TreeNode* node) {
if (node != NULL) {
postOrderTraversal(node->left);
postOrderTraversal(node->right);
printf("%g %c", node->num, node->op);
}
}
// 计算表达式值(假设只有加减操作)
double evaluateInfix(char* infix) {
char* token = strtok(infix, " ");
TreeNode* root = NULL;
while (token != NULL) {
double num = atof(token); // 转换为数字
root = insertNode(&root, (token[0] == '+' ? '+' : '-'), num);
token = strtok(NULL, " ");
}
double result = calculatePostOrder(root);
return result;
}
// 从后序遍历结果恢复并计算表达式值
double calculatePostOrder(TreeNode* node) {
if (node == NULL) return 0;
double left = calculatePostOrder(node->left);
double right = calculatePostOrder(node->right);
if (node->op == '+') return left + right;
return left - right;
}
int main() {
char expression[] = "5 + 3 * 4";
double result = evaluateInfix(expression);
printf("Expression value: %.2f\n", result);
TreeNode* treeRoot = root;
printf("Preorder traversal: ");
preOrderTraversal(treeRoot);
printf("\n");
printf("Inorder traversal: ");
inOrderTraversal(treeRoot);
printf("\n");
printf("Postorder traversal: ");
postOrderTraversal(treeRoot);
printf("\n");
return 0;
}
```
在这个例子中,我们假设输入的表达式只包含加减运算。实际项目中,你需要处理更复杂的表达式,包括括号和优先级。请注意,这个代码片段仅作演示,完整实现可能需要额外处理错误边界和复杂运算。
阅读全文