python實現中序遍歷表達式二叉樹,前綴、中綴、後綴表達式生成表達式二叉樹

# coding:UTF8

class TNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # 判斷是不是運算符
    def isOper(self, ch): if ch in ['+', '-', '*', '/', '^', '(', ')']: return True return False # 獲取運算符所對應的優先級別
    def getOperOrder(self, ch): if ch == '(': return 1
        if ch in ['+', '-']: return 2
        if ch in ['*', '/']: return 3
        if ch == '^': return 4
       return 0
      
# 中序遍歷表達式二叉樹 def InorderTree(self, pNode): if not pNode: return if pNode.left: # 若是左子樹是符號,且優先級低於父節點的優先級則須要加括號 if self.isOper(pNode.left.val) and self.getOperOrder(pNode.left.val) < self.getOperOrder(pNode.val): res.append('(') self.InorderTree(pNode.left) res.append(')') else: self.InorderTree(pNode.left) res.append(pNode.val) if pNode.right: # 若是有子樹是符號且優先級低於父節點的優先級,則須要加括號 if self.isOper(pNode.right.val) and self.getOperOrder(pNode.right.val) <= self.getOperOrder(pNode.val): res.append('(') self.InorderTree(pNode.right) res.append(')') else: self.InorderTree(pNode.right) # 建立二叉樹 def createTree(self, data): if not data: return ch = data.pop(0) if ch == '#': return None else: root = TNode(ch) root.left = self.createTree(data) root.right = self.createTree(data) return root # 後綴表達式生成二叉樹 def PostExpTree(self, data): if not data: return re = [] while data: tmp = data.pop(0) if not self.isOper(tmp): re.append(TNode(tmp)) else: p = TNode(tmp) p.right = re.pop() p.left = re.pop() re.append(p) return re.pop() # 前綴表達式生成二叉樹 def PreExpTree(self, data): re = [] while data: tmp = data.pop() if not self.isOper(tmp): re.append(TNode(tmp)) else: p = TNode(tmp) p.left = re.pop() p.right = re.pop() re.append(p) return re.pop() # 中綴表達式生成二叉樹 def InExpTree(self, data): re = [] op = [] while data: tmp = data.pop(0) if not self.isOper(tmp): re.append(tmp) else: if tmp == '(': op.append('(') elif tmp == ')': while op[-1] != '(': re.append(op.pop()) op.pop() elif tmp in ['+', '-', '*', '/']: while op and op[-1] != '(' and self.getOperOrder(op[-1]) >= self.getOperOrder(tmp): re.append(op.pop()) op.append(tmp) if op: re = re + op[::-1] print re return self.PostExpTree(re) data = ['*', 3, '#', '#', '-', 7, '#', '#', 2, '#', '#'] s = Solution() t1 = s.createTree(data) # t1 = s.PostExpTree([3, 7, 2, '-', '*']) # t1 = s.PreExpTree(['*', 3, '-', 7, 2]) # t1 = s.InExpTree([9, '+', '(', 3, '-', 1, ')', '*', 3, '+', 10, '/', 2]) res = [] s.InorderTree(t1) res = map(str, res) print ''.join(res)

結果:app

相關文章
相關標籤/搜索