题目
2016年9月6日华为笔试最后一道题(300分)为波兰式转化为逆波兰式的问题,具体题目为:
描述:
波兰表示法,是一种逻辑、算术和代数表示方法,其特点是操作符置于操作数的前面,因此也称为前缀表示法。例如:“a+b”的波兰表示法为:“+ab”。
逆波兰表示法是一种数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也称为后缀表示法。例如:“a+b”的逆波兰表示法为:“ab+”。
题目要求将输入的波兰表示法表达式转换为逆波兰表示法表达式。
说明:
给定输入和结果输出运算符和变量之间均用逗号隔开。题目给定的运算符仅有“+”、“-”、“*”、“/”四种。
示例输入(波兰式):“-,+,a,*,+,b,c,d,e”
对应的中缀表达式:“a+(b+c)*d-e”
结果输出(逆波兰式):“a,b,c,+,d,*,+,e,-,”
解题思路
由上图二叉树我们可知,前缀表达式实际上是二叉树的前序遍历,后缀表达式实际上是二叉树的后续遍历。以上二叉树有一个特点,即叶子节点为字母(非操作符)。由此特点,若知道前序、中序、后序遍历中的任何一种,都可一还原上图二叉树。
由此,解题思路为:
1. 根据前缀表达式,构建二叉树;
2. 后序遍历该二叉树,即得到后缀表达式(逆波兰式)。
由于前序遍历是先根,后左右结点。在构建二叉树时,有如下规则:
1. 先确定根节点root。从左向右遍历前缀序列,根节点即为前缀序列的第一个字符,其值为“-”;
2. 第二个字符即为其左结点,其值为“+”;
3. 若第三个字符为操作符,则右结点为最后一个字符。否则为第三个字符;此例中为最后一个字符“e”;
4. 然后以左右结点中为操作符的结点作为根节点,重复1-3,即可还原二叉树。
代码实现
实现代码如下:
import java.util.Scanner;
/**
* Tile:
* Author: zsd
* Date: 16-9-6
* Email:726679904@qq.com
*/
class TreeNode {
public TreeNode left;