二叉树ParseTree

class BinaryTree:
    def __init__(self,rootObj):#构造函数,初始化节点对象,同时也是树对象
        self.key = rootObj
        self.leftChild = None
        self.rightChild = None

    def insertLeft(self,newNode):
        if self.leftChild == None:
            self.leftChild = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.leftChild = self.leftChild
            self.leftChild = t

    def insertRight(self,newNode):
        if self.rightChild == None:
            self.rightChild = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.rightChild = self.rightChild
            self.rightChild = t

    def getRightChild(self):
        return self.rightChild

    def getLeftChild(self):
        return self.leftChild

    def setRootVal(self,obj):
        self.key = obj

    def  getRootVal(self):
        return self.key
        
#在开始之前,先初始化一个空的根节点
#1.如果目前的符号是“(”,为当前的节点增加一个左孩子节点,并下降来到左孩子节点
#2.如果目前的符号是[+,-,*,/],将当前节点的值设置为该符号,并且为当前节点增加一个右孩子节点,并下降来到右孩子节点
#3.如果目前的符号是一个数字,将当前节点的值设置为该数字,并返回它的父亲节点
#4.如果目前的符号是“)”,返回当前节点的父亲节点
from myStack import *
from tree import *
def buildParseTree(expression):
    expressionList = []
    for i in expression:#将原表达式转换为列表,便于处理每一个字符
        expressionList.append(i)
    indexStack = Stack()#用于存储父节点,必要的时候拿出来返回
    parseTree  = BinaryTree('')#先初始化一个空的根节点
    indexStack.push(parseTree)
    currentNode = parseTree

    for i in expressionList:
        if i == '(':
            currentNode.insertLeft('')
            indexStack.push(currentNode)
            currentNode = currentNode.getLeftChild()
        elif i in ['+','-','*','/']:
            currentNode.setRootVal(i)
            currentNode.insertRight('')
            indexStack.push(currentNode)
            currentNode = currentNode.getRightChild()
        elif i not in [')','+','-','*','/']:
            currentNode.setRootVal(int(i))
            parent = indexStack.pop()

            currentNode = parent
        else:
            currentNode = indexStack.pop()

    return parseTree

def evaluate(parseTree):
    signals = ['+','-','*','/']
    if parseTree.getLeftChild() and parseTree.getRightChild():
        leftNumber = evaluate(parseTree.getLeftChild())
        rightNumber = evaluate(parseTree.getRightChild())
        signal = parseTree.getRootVal()
        if signals.index(signal) == 0:
            return leftNumber + rightNumber
        elif signals.index(signal) == 1:
            return leftNumber - rightNumber
        elif signals.index(signal) == 2:
            return leftNumber * rightNumber
        else:
            return leftNumber/rightNumber
    else:
        return parseTree.getRootVal()


转载于:https://my.oschina.net/stevenKelly/blog/391653

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值