c语言二叉树的表达式求值算法

时间: 2023-10-04 07:05:56 浏览: 151
二叉树表达式求值算法可以分为两个步骤: 1. 将中缀表达式转换为二叉树 2. 对二叉树进行后序遍历,计算表达式的值 下面是具体的代码实现: ``` #include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct Stack { int top; int capacity; TreeNode **array; } Stack; TreeNode *createNode(char data) { TreeNode *newNode = (TreeNode *)malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } Stack *createStack(int capacity) { Stack *newStack = (Stack *)malloc(sizeof(Stack)); newStack->top = -1; newStack->capacity = capacity; newStack->array = (TreeNode **)malloc(capacity * sizeof(TreeNode *)); return newStack; } void push(Stack *stack, TreeNode *node) { if (stack->top == stack->capacity - 1) { printf("Stack overflow!\n"); return; } stack->array[++stack->top] = node; } TreeNode *pop(Stack *stack) { if (stack->top == -1) { printf("Stack underflow!\n"); return NULL; } return stack->array[stack->top--]; } int isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int getPriority(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } TreeNode *buildTree(char *expression) { Stack *stack = createStack(strlen(expression)); TreeNode *root = NULL; int i; for (i = 0; expression[i] != '\0'; i++) { if (isdigit(expression[i])) { TreeNode *newNode = createNode(expression[i]); push(stack, newNode); } else if (isOperator(expression[i])) { TreeNode *newNode = createNode(expression[i]); newNode->right = pop(stack); newNode->left = pop(stack); push(stack, newNode); } } root = pop(stack); free(stack); return root; } int evaluate(TreeNode *root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return root->data - '0'; } int leftValue = evaluate(root->left); int rightValue = evaluate(root->right); switch (root->data) { case '+': return leftValue + rightValue; case '-': return leftValue - rightValue; case '*': return leftValue * rightValue; case '/': return leftValue / rightValue; default: return 0; } } int main() { char expression[] = "52+3*"; TreeNode *root = buildTree(expression); printf("The value of the expression is: %d\n", evaluate(root)); return 0; } ``` 在上面的代码中,我们使用了一个栈来辅助进行中缀表达式的转换和后序遍历计算。在转换中缀表达式为二叉树时,如果遇到数字,我们就创建一个节点,并将其入栈;如果遇到运算符,我们就从栈中弹出两个节点,将运算符作为根节点,左右子树分别为弹出的两个节点,然后将根节点入栈。在计算表达式的值时,我们对二叉树进行后序遍历,并根据节点的类型进行不同的操作:如果是数字节点,就返回其对应的值;如果是运算符节点,就计算其左右子树的值,并根据运算符进行相应的计算。最后得到的结果就是表达式的值。 需要注意的是,上面的代码只能处理不带括号的简单中缀表达式。如果表达式中含有括号,那么我们需要先将中缀表达式转换为后缀表达式,然后再进行二叉树的构建和计算。

相关推荐

最新推荐

recommend-type

c语言 实现二叉树操作 用栈实现算术表达式求值

2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的...
recommend-type

c语言难点分析整理,C语言

15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 ...
recommend-type

高级C语言 C 语言编程要点

15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 ...
recommend-type

c/c++ 学习总结 初学者必备

从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的 大小; 2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且以'\0'结尾的; 对于静态数组处理: ...
recommend-type

埃森哲制药企业数字化转型项目顶层规划方案glq.pptx

埃森哲制药企业数字化转型项目顶层规划方案glq.pptx
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。