13.3 表达式树
算术表达式可以用二叉树的形式表示,称为表达式树(expression tree)。其操作符位于内结点,而操作数位于叶结点。表达式树可以用于对表达式本身求值,也可以将中序表达式转变成前序表达式或者后序表达式。
13.3.1 表达式树ADT
算术操作符可分为一元操作符(-a, a!)和二元操作符(a + b)。这里,先只考虑二元操作符。将操作符储存在根结点,而操作符左边部分则储存在左子树中,右边部分则储存在右子树中。
其所具有方法包括:
- ExpressionTree(expStr):将输入的表达式字符串转变成表达式树,假定输入的表达式字符串是合法的,并带有全括号的表达式;
- evaluate(varDict):对表达式树进行求值,并返回数值结果,若表达式树中含有变量,则从输入的字典中,对变量进行取值,除以零或使用未定义变量将会引发异常;
- toString():将表达式树转变成表达式字符串。
将表达式树转变成表达式字符串
对表达式进行后序遍历,即可发现后序遍历得到的正好就是表达式的后缀表示法。相应的,前序遍历,得到的正好就是表达式的前缀表示法。
对于中序遍历,它能得到表达式对于其内操作符以及操作数的正确运算顺序,只是我们需要将其用括号括起来。
利用表达式树对表达式求值
每一