四则运算表达式与二叉树
四则运算表达式
- 前缀表达式:运算符位于操作数之前,如
+ab
- 中缀表达式:平时使用的标准四则运算表达式,如
a+b
- 后缀表达式:运算符位于操作数之后,如
ab+
二叉树三种遍历方式
先序遍历
- 访问根节点
- 先序遍历左子树
- 先序遍历右子树
中序遍历
- 中序遍历左子树
- 访问根节点
- 中序遍历右子树
后续遍历
- 后序遍历左子树
- 后续遍历右子树
- 访问根节点
传统方式进行四则运算式的变换
中缀表达式转换为后缀表达式
从左往右
遍历中缀表达式中的每一个数字和符号- 如果是数字就输出,即成为后缀表达式的一部分
- 如果是操作符,则判断其与栈顶元素的优先级,当该操作符是右括号或优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈,直到最终。
例如:此时给出一个中缀表达式:
a*(b+c)-d
中缀表达式转换为前缀表达式
从右往左
遍历中缀表达式中的每一个数字和符号- 如果是操作数就进行输出
- 如果是操作符,判断其与栈顶元素的优先级,栈为空时直接入栈。优先级更高或相等时直接入栈,否则输出。
- 当遇到括号时,右括号直接入栈,左括号时依次弹出直到遇到左括号为止。到此括号丢弃
注意:与输出后缀表达式不一样,这里的输出类似一个栈,输出的值从后往前写。这里就不做了。
括号法进行四则运算的变换
同样使用中缀表达式
a*(b+c)-d
转为前缀表达式
- 为表达式所有运算单位添加括号,以便运算顺序清晰可见。如此处添加括号后得到的值为
((a*(b+c))-d)
- 将运算符号移动到对应括号的前面:
- * a + b c d
转为后缀表达式
- 为表达式所有运算单位添加括号,以便运算顺序清晰可见。如此处添加括号后得到的值为
((a*(b+c))-d)
- 将运算符移动号对应括号的后面:
a b c + * d -
二叉树法进行四则运算的变化
原理:四则运算式的中缀表达式是该式对应的二叉树的中序遍历所得的值。由中缀表达式得到的二叉树,他的先序遍历所得到的序列就是前缀表达式,他的后续遍历所得到的的值就是后缀表达式。
同样使用中缀表达式
a*(b+c)-d
难点:将中缀表达式变换为二叉树。
解答:如括号法
一样,先为表达式所有的运算单位都添加上括号,然后逐层拆分括号,将运算符作为根节点,运算符左边的值划分给左子树,右边的值划分给右子树,左右子树再按照这个方法进行分解,得到最终值。如上,得到的二叉树,然后自行运算即可,运算结果在括号法中给出了。