一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
一、前言
后缀表达式由波兰的逻辑学家卢卡西维兹提出,也称逆波兰表达式。后缀表达式的特点是:没有括号,运算符总是放在和它相关的操作数之后。
二、解题思路
后缀表达式严格遵循「从左到右」的运算。根据后缀表达式建立二叉树的基本方法就是使用一个栈存储操作数,从左到右遍历后缀表达式,进行如下操作:
- 遇到操作数,则执行入栈操作;
- 遇到运算符,则将栈顶两个元素出栈,并且以该运算符作为新的子树的根节点,第一个出栈的元素作为右节点,第二个出栈的元素作为左节点,然后将根节点入栈。
整个后缀表达式遍历完成之后,栈内只有一个元素,则该元素即为整颗表达式树的根节点,至此后缀表达式建树算法完成。
可能直接文字描述还是有一些抽象,我们举个🌰说明一下。
如图所示是一颗表达式树,不难得出后序遍历的结果为:
该表达式就是算术表达式的后缀表示法,也称逆波兰表示法。那么如何根据后缀表达式建立一颗二叉树呢?让我来用图解的方式描述一下上面的算法:
- a和b是两个操作数先入栈
- 遇到+运算符,a和b弹出,构建新子树
- 然后将根节点入栈
4. 遇到c,入栈
5. 遇到x,弹出+和c,以x为根节点构建新子树
- x入栈
7. 遇到d,入栈;遇到e,入栈
8. 遇到/,弹出栈顶两个元素d、e,并以/为根节点建树
9. /入栈
- 遇到-,弹出栈顶两个元素x和/,并以-为根节点建树
- 至此后缀表达式遍历完毕,表达式树建立成功。