• python-数据结构代码 树数据结构(树的遍历)


    #列表表示树
    def BinaryTree(r):
        return [r, [], []]
    
    def insertLeft(root,newBranch):
        t = root.pop(1)
        if len(t) > 1:
            root.insert(1,[newBranch,t,[]])
        else:
            root.insert(1,[newBranch, [], []])
        return root
    
    def insertRight(root,newBranch):
        t=root.pop(2)
        if len(t)>1:
            root.insert(2,[newBranch,[],t])
        else:
            root.insert(2,[newBranch,[],[]])
        return root
    
    def getRootVal(root):
        return root[0]
    
    def setRootVal(root,newVal):
        root[0]=newVal
    
    def getLeftChild(root):
        return root[1]
    
    def getRightChild(root):
        return root[2]
    
    #节点表示树
    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
    
        def preorder(self):
            print(self.key)
            if self.leftChild:
                self.leftChild.preorder()
            if self.rightChild:
                self.rightChild.preorder()
    
    r = BinaryTree('a')
    print(r.getRootVal())
    print(r.getLeftChild())
    r.insertLeft('b')
    print(r.getLeftChild())
    print(r.getLeftChild().getRootVal())
    r.insertRight('c')
    print(r.getRightChild())
    print(r.getRightChild().getRootVal())
    r.getRightChild().setRootVal('hello')
    print(r.getRightChild().getRootVal())
    print('+++++++++++++++++++++++')
    
    from pythonds.basic.stack import Stack
    from pythonds.trees.binaryTree import BinaryTree
    
    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)
                currentTree=currentTree.getRightChild()
            elif i ==')':
                currentTree=pStack.pop()
            else:
                raise ValueError
        return eTree
    pt = buildParseTree("( ( 10 + 5 ) * 3 )")
    print(pt)
    pt.postorder()
    
    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()]
            return fn(evaluate(leftC),evaluate(rightC))
        else:
            return parseTree.getRootVal()
        
    def preorder(tree):
        if tree:
            print(tree.getRootVal())
            preorder(tree.getLeftChild())
            preorder(tree.getRightChild())
    
    def postorder(tree):
        if tree!= None:
            postorder(tree.getLeftChild())
            postorder(tree.getRightChild())
            print(tree.getRootVal())
    
    def postordereval(tree):
        opers={'+':operator.add,'-':operator.sub,'*':operator.mul,'/':operator.truediv}
        res1=None
        res2=None
        if tree:
            res1=postordereval(tree.getLeftChild())
            res2=postordereval(tree.getRightChild())
            if res1 and res2:
                return opers[tree.getRootVal()](res1,res2)
            else:
                return tree.getRootVal()
    
    def inorder(tree):
        if tree != None:
            inorder(tree.getLeftChild())
            print(tree.getRootVal())
            inorder(tree.getRightChild())
    
    def printexp(tree):
        sVal=""
        if tree:
            sVal='(' + printexp(tree.getLeftChild())
            sVal=sVal + str(tree.getRootVal())
            sVal=sVal+printexp(tree.getRightChild())+')'
        return sVal
  • 相关阅读:
    下载安装ActiveMQ(消息队列)
    互联网项目架构之基于服务的分布式架构
    Shell报错bash^M /bin/bash^M: bad interpreter: No such file or directory
    rpm参数
    zabbix3.4+grafana5.0.1数据可视化
    Linux下目录栈操作详解
    有惊无险,拯救zabbix网页端
    tomcat7 开启gzip压缩
    欢迎使用CSDN-markdown基本语法
    新项目平台后台测试环境搭建
  • 原文地址:https://www.cnblogs.com/lely/p/10147777.html
Copyright © 2020-2023  润新知