【图解+文字】一文看懂后缀表达式建树

891 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

一、前言

后缀表达式由波兰的逻辑学家卢卡西维兹提出,也称逆波兰表达式。后缀表达式的特点是:没有括号,运算符总是放在和它相关的操作数之后。

二、解题思路

后缀表达式严格遵循「从左到右」的运算。根据后缀表达式建立二叉树的基本方法就是使用一个栈存储操作数,从左到右遍历后缀表达式,进行如下操作:

  • 遇到操作数,则执行入栈操作;
  • 遇到运算符,则将栈顶两个元素出栈,并且以该运算符作为新的子树的根节点,第一个出栈的元素作为右节点,第二个出栈的元素作为左节点,然后将根节点入栈。

整个后缀表达式遍历完成之后,栈内只有一个元素,则该元素即为整颗表达式树的根节点,至此后缀表达式建树算法完成。

可能直接文字描述还是有一些抽象,我们举个🌰说明一下。

image.png 如图所示是一颗表达式树,不难得出后序遍历的结果为:

image.png

该表达式就是算术表达式的后缀表示法,也称逆波兰表示法。那么如何根据后缀表达式建立一颗二叉树呢?让我来用图解的方式描述一下上面的算法:

  1. a和b是两个操作数先入栈

image.png

  1. 遇到+运算符,a和b弹出,构建新子树

image.png

  1. 然后将根节点入栈

image.png 4. 遇到c,入栈

image.png 5. 遇到x,弹出+和c,以x为根节点构建新子树

image.png

  1. x入栈

image.png 7. 遇到d,入栈;遇到e,入栈

image.png 8. 遇到/,弹出栈顶两个元素d、e,并以/为根节点建树

image.png 9. /入栈

image.png

  1. 遇到-,弹出栈顶两个元素x和/,并以-为根节点建树

image.png

  1. 至此后缀表达式遍历完毕,表达式树建立成功。