数据结构学习笔记18(北大公开课)目录
树的应用之表达式解析
一、知识概览
本章主要讲树的应用——表达式解析。
1.1 树的应用
本节主要讲如何建立表达式解析树以及如何利用表达式解析树求值
二、代码实现
2.1 表达式解析树的建立
#表达式解析树
def buildParseTree(fpexp):#字符串表达的全括号表达式
fplist=fpexp.split()#创建单词列表
pStack=Stack()#创建节点的栈
eTree=BinaryTree('')#创建空二叉树
pStack.push(eTree)#当前节点入栈
currentTree=eTree#当前节点设为刚建立的节点
for i in fplist:#对每个单词从左到右挨个扫描
if i=='(':#表达式开始
currentTree.insertLeft('')#创建左子节点
pStack.push(currentTree)#老的当前节点入栈
currentTree=currentTree.getLeftChild()
elif i not in ['+','-','*','/',')']:
currentTree.setRootval(int(i))
parent=pStack.pop()
currentTree=parent#出栈上升
elif i in ['+','-','*','/']:
currentTree.setRootval(i)#当前节点设成操作符
currentTree.insertRight('')#创建一个右子树
pStack.push(currentTree)#老的当前节点push到栈
currentTree=currentTree.getRightChild#下降到右子节点
elif i==')':#表达式结束
currentTree=pStack.pop()#出栈上升返回到父节点
else:
raise ValueError#例外处理
2.2 表达式解析树求值
#利用表达式解析树求值
import operator
def evaluate(parseTree):
opers={'+':operator.add,'-':operator.sub,\
'*':operator.mul,'/':operator.truediv}
#缩小规模
leftC=parseTree.getLeftChild()#存储左子树
rightC=parseTree.getRightChild()#存储右子树
if leftC and rightC:#如果有左右子树,递归调用
fn=opers[parseTree.getRootVal()]#fn翻译保存的操作符
return fn(evaluate(leftC),evaluate(rightC))
else:
return parseTree.getRootVal