小鱼要学数据结构与算法(基于python)—Day18 树的应用之表达式解析

树的应用之表达式解析

在这里插入图片描述

一、知识概览

本章主要讲树的应用——表达式解析。

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章