中缀表达式转换成表达式树

1,322 阅读3分钟

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.\

如下图所示:
image.png

1.2.2、辅助栈方式

1、借助两个辅助栈,一个称做optr,用以暂存运算符;另一个称做expt,用以暂存已建立好的表达式树的根结点。
2、从左向右扫描表达式,存放到element变量中。
3、如果element为运算对象,则生成一个只有根节点的二叉树结点,并且入expt栈。
4、如果element是运算符,则获取optr栈顶运算符,进行如下判断:\

  1. 如果element为括号,进行如下判断:
    如果optr栈为空或者element为左括号'(',则element直接入optr栈。
    如果element为右括号')',则再次执行步骤4,直到
  2. 如果element不是括号,进行如下判断:
    如果element的优先级大于栈顶运算符的优先级,则element入optr栈。
    如果element的优先级小于栈顶运算符的优先级,则弹出optr的栈顶运算符,从expt栈中弹出两个表达式子树的根结点,以刚弹出的栈顶运算符为根结点,以expt栈中弹出的第二个子树作为左子树,以expt栈中弹出的第一个子树作为右子树,创建一棵新二叉树,并将该树根结点压入expt栈中。

5、当表达式扫描完毕,执行下面操作,直至optr栈为空:

  • 从optr栈中弹出运算符,从expt栈中弹出两个表达式子树的根结点,以刚弹出的栈顶运算符为根结点,以expt栈中弹出的第二个子树作为左子树,以expt栈中弹出的第一个子树作为右子树,创建一棵新二叉树,并将该树根结点压入expt栈中。

1.3、说明一下用途

前序遍历表达式树,可以得到前缀表达式;
中序遍历表达式树,可以得到中缀表达式;
后序遍历表达式树,可以得到后缀表达式。