1、介绍及转换方法
1.1、介绍
表达式树就是将一个中缀表达式转换成一个不带有括号,所有叶子结点均为运算对象,所有非叶子结点均为运算符的二叉树。 表达式树建立后,利用二叉树的遍历等操作,很容易得到前缀表达式和后缀表达式,以及实现表达式的求值运算。
1.2、转换方法
例如有一个表达式 1+((2+3)*4)-5 请将其转换成表达式树的形式。
1.2.1、快速方式
快速方式适用于我们在线下手动绘画表达式树。
1、按照优先级添加上括号。
((1+((2+3)*4))-5)
2、从外层括号到内层括号,依次生成二叉树。
- 根是-,左子树为(1+((2+3)*4)),右子树为5.
- (1+((2+3)*4))的根为+,左子树为1,右子树为((2+3)*4).
- ((2+3)4)的根为,左子树为(2+3),右子树为4. -(2+3)的根为+,左子树为2,右子树为3.\
如下图所示:
1.2.2、辅助栈方式
1、借助两个辅助栈,一个称做optr,用以暂存运算符;另一个称做expt,用以暂存已建立好的表达式树的根结点。
2、从左向右扫描表达式,存放到element变量中。
3、如果element为运算对象,则生成一个只有根节点的二叉树结点,并且入expt栈。
4、如果element是运算符,则获取optr栈顶运算符,进行如下判断:\
- 如果element为括号,进行如下判断:
如果optr栈为空或者element为左括号'(',则element直接入optr栈。
如果element为右括号')',则再次执行步骤4,直到- 如果element不是括号,进行如下判断:
如果element的优先级大于栈顶运算符的优先级,则element入optr栈。
如果element的优先级小于栈顶运算符的优先级,则弹出optr的栈顶运算符,从expt栈中弹出两个表达式子树的根结点,以刚弹出的栈顶运算符为根结点,以expt栈中弹出的第二个子树作为左子树,以expt栈中弹出的第一个子树作为右子树,创建一棵新二叉树,并将该树根结点压入expt栈中。5、当表达式扫描完毕,执行下面操作,直至optr栈为空:
- 从optr栈中弹出运算符,从expt栈中弹出两个表达式子树的根结点,以刚弹出的栈顶运算符为根结点,以expt栈中弹出的第二个子树作为左子树,以expt栈中弹出的第一个子树作为右子树,创建一棵新二叉树,并将该树根结点压入expt栈中。
1.3、说明一下用途
前序遍历表达式树,可以得到前缀表达式;
中序遍历表达式树,可以得到中缀表达式;
后序遍历表达式树,可以得到后缀表达式。