一、表达式与二叉树的关系
前缀表达式对应于二叉树的前序遍历;
中缀表达式对应于二叉树的中序遍历;
后缀表达式对应于二叉树的后序遍历;
二、根据中缀表达式生成二叉树
中缀表达式:a + b * (c - d) - e / f
中序遍历为:左儿子、根节点、右儿子
按照操作符的优先级,其二叉树生成过程为:
1. c-d的优先级高,根是-操作符,c和d分别为左右儿子
-
| |
c d
2.接下来是乘法,根是*操作符,b和1中的内容分别是左右儿子
*
| |
b -
| |
c d
3.接下来是触发,根是/操作符,e和f分别是左右儿子
/
| |
e f
4.接下来是加法,根是+操作符,a和2中的内容分别是左右儿子
+
| |
a *
| |
b -
| |
c d
还包括3中的那棵树。
5. 接下来是减法,根是-操作符,4中的两棵树分别是左右儿子
-
| |
+ /
| | | |
a * e f
| |
b -
| |
c d
三、根据二叉树前序遍历得到前缀表达式
前序遍历为:根节点、左儿子、右儿子
得到前缀表达式为:- + a * b - cd / ef
四、根据二叉树后序遍历得到后缀表达式
后序遍历为:左儿子、右儿子、根节点
得到后缀表达式为:abcd - * + ef / -
五、小结
若可以根据前缀、中缀、或后缀表达式确定一颗二叉树,则可以生成相应的前缀、中缀、后缀表达式。
前序遍历、中序遍历、后续遍历的结义方法:
1. 前序就是根节点在前边,中序就是根节点在中间,后续就是根节点在后边
2. 总是先左儿子,再右儿子。
前序:根节点、左儿子、右儿子
中序:左儿子、根节点、右儿子
后续:左儿子、右儿子、根节点