小鱼要学数据结构与算法(基于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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值