二叉表达式树

问题分析

在编译器进行运算时,为了避免对于运算符优先级的考虑,可以将其转换成为一个后缀表达式和前缀表达式。为了实现这个转换,我们可以使用一个二叉树对其进行表示。为什么要采用二叉树?
对于一个表达式来讲一定具有基本的运算单元,例如 2+5 就是一个基本运算单元,其中包含一个运算符和两个操作数。这与二叉树的结构十分类似,我们可以用根节点表示运算符,使用左右子节点表示操作数,因此我们可以使用二叉树作为表达式的存储结构。
image.png
下面我们介绍三种二叉表达式树的转换
该文章参考自:数据结构与算法-表达式二叉树 - 掘金

前缀表达式转换二叉树

对于一个前缀表达式的二叉树表示相对简单,因为在转换的过程中我们不需要考虑到关于运算符优先级的问题。
从右向左读取表达式,当遇到操作数时放入栈中,遇到运算符则取出栈顶的两个操作数,构建一个新的子树放入栈中。

后缀表达式转换二叉树

后缀表达式与前缀类似。
从左向右读取表达式,当遇到操作数时放入栈中,遇到运算符则取出栈顶的两个操作数,构建一个新的子树放入栈中。

中缀表达式转换二叉树

中缀表达式有一些麻烦,需要两个栈,一个用来存储操作数(A),一个用来存储运算符(B)。
从左向右读取,遇到运算符放入 B 中,遇到操作数放入 A 中。

  • 当遇到运算符优先级小于或等于当前的栈顶元素时,取出当前的栈顶元素,直到遇到左括号或优先级小于当前元素。
  • 当遇到右括号时,取出当前的栈顶元素,直到遇到左括号。

将取出的栈顶元素依次于 A 中的元素进行构建子树,每构建一个子树就放回 A 中。
该思路也可以作为对于中缀表达式进行求值时,不先转换为后缀表达式,而是直接借助两个栈进行求值。

输出中缀表达式

对于一颗表达式二叉树,按照前,中,后三种遍历的方式分别可以得到前缀表达式,中缀表达式,后缀表达式。当我们得到的表达式与手算的不同时,有可能是对于同一级别的运算符按照了不同的优先顺序进行操作。
对于前缀和后缀我们都无需考虑括号的问题,但是对于中缀我们需要考虑一下括号问题。
当进行加减乘除的四则运算时,会出现一下几种情况:

  • 当根节点为 “+”:对于加号,无论其左右为什么都无需考虑括号。
  • 当根节点为 “-” :对于减号,我们需要考虑其右子节点的问题,如果右子节点为 “+” 或 “-” ,则需要加上括号,因为如果不加上括号,会出现去括号变号的情况。
  • 当根节点为 “*”:对于乘号,如果左,右子节点为 “+” 或 “-” ,则需要加上括号。
  • 当根节点为 “/”:对于除号,如果左,右子节点为 “+” 或 “-” ,则需要加上括号,同时如果右子节点为 “*” 或 “/” ,需要加上括号,原因与上述 “-” 号相同,均是由于会出现变号的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值