''' æé 䏿£µè§£ææ éè¦è°ç¨ä¹ååè¿çStackæä»¶åBinaryTreeæä»¶ ''' from Stack import Stack from BinaryTree import BinaryTree import operator # æé è§£ææ 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 # éå½å®ç°ä¸¤ä¸ªå¶ç»ç¹çè¿ç® 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 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 pt = buildParseTree("( ( 10 + 5 ) * 3 )") # pt.preorder() # postorder(pt) # ans = evaluate(pt) # print(ans) # print(postordereval(pt)) # inorder(pt) # print(pt) sVal = printexp(pt) print(sVal)