限时干货下载:
回复【7】免费获取【完整数据分析资料!(包括SPSS、SAS、SQL、EXCEL、Project)!】
来源: wzhvictor
链接:https://segmentfault.com/a/1190000004095634
解析树
完成树的实现之后,现在我们来看一个例子,告诉你怎么样利用树去解决一些实际问题。在这个章节,我们来研究解析树。解析树常常用于真实世界的结构表示,例如句子或数学表达式。
图 1:一个简单句的解析树
图 1 显示了一个简单句的层级结构。将一个句子表示为一个树,能使我们通过利用子树来处理句子中的每个独立的结构。
图 2: ((7+3)*(5−2)) 的解析树
如图 2 所示,我们能将一个类似于 ((7+3)*(5−2)) 的数学表达式表示出一个解析树。我们已经研究过全括号表达式,那么我们怎样理解这个表达式呢?我们知道乘法比加或者减有着更高的优先级。因为括号的关系,我们在做乘法运算之前,需要先计算括号内的加法或者减法。树的层级结构帮我们理解了整个表达式的运算顺序。在计算最顶上的乘法运算前,我们先要计算子树中的加法和减法运算。左子树的加法运算结果为 10,右子树的减法运算结果为 3。利用树的层级结构,一旦我们计算出了子节点中表达式的结果,我们能够将整个子树用一个节点来替换。运用这个替换步骤,我们得到一个简单的树,如图 3 所示。
图 3: ((7+3)*(5−2)) 的化简后的解析树
在本章的其余部分,我们将更加详细地研究解析树。尤其是:
怎样根据一个全括号数学表达式来建立其对应的解析树
怎样计算解析树中数学表达式的值
怎样根据一个解析树还原数学表达式
如果当前读入的字符是'(',添加一个新的节点作为当前节点的左子节点,并下降到左子节点处。
如果当前读入的字符在列表['+', '-', '/', '*']中,将当前节点的根值设置为当前读入的字符。添加一个新的节点作为当前节点的右子节点,并下降到右子节点处。
如果当前读入的字符是一个数字,将当前节点的根值设置为该数字,并返回到它的父节点。
如果当前读入的字符是’)’,返回当前节点的父节点。
在我们编写 Python 代码之前,让我们一起看一个上述的例子。我们将使用 (3+(4*5))
这个表达式。我们将表达式分解为如下的字符列表:['(', '3', '+', '(', '4', '*', '5' ,')',')']。一开始,我们从一个仅包括一个空的根节点的解析树开始。如图 4,该图说明了随着每个新的字符被读入后该解析树的内容和结构。