#列表表示树 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