問題:已知一個二叉樹前序遍歷爲:ABDEGCFH,中序遍歷爲:DBGEACHF,則該二叉樹的後序遍歷爲?python
思路是這樣的:1:根據前序遍從來肯定每次根節點的位置,由於前序遍歷先訪問的是根節點,因此前序遍歷第一個位置就是根節點。 2:根據根節點和中序遍歷將樹劃分爲左右兩棵樹。3:根據第一步和第二步遞歸的處理左右兩棵樹。post
第一步:根據前序遍歷 A B D E G C F H 肯定頭結點是A,根據中序遍歷 D B G E A C H F 將樹劃分爲左子樹 D B G E 和右子樹 C H F。
第二步:劃分爲左右兩棵子樹:對於左子樹,前序遍歷是 B D E G,後續遍歷是 D B G E。對於右子樹,前序遍歷是 C F H,後續遍歷是 C H F。
第三步:對左子樹和右子樹分別運用第一步和第二步進行分析。
遞歸結束的條件:當中序遍歷的節點只剩下一個節點的時候,那麼這個節點就是葉子節點。ui
總體的操做流程以下:
code
Python代碼以下:blog
class TreeNode: """樹節點""" def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def reConstructBinaryTree(self, pre, tin): """根據前序遍歷和中序遍從來重建一顆二叉樹,要求前序遍歷和中序遍歷當中字符不重複 Args: pre: 前序遍歷 list類型或者者str類型 tin: 中序遍歷 Returns: head: 一個TreeNode類型的根節點 """ return self.rebuild_tree(pre, 0, len(pre)-1, tin, 0, len(tin)-1) def rebuild_tree(self, pre, pre_start, pre_end, tin, tin_start, tin_end): """遞歸的進行樹的重建""" if pre_start > pre_end or tin_start > tin_end: return None head = TreeNode(pre[pre_start]) tin_mid = tin.index(pre[pre_start]) left_length = tin_mid - tin_start head.left = self.rebuild_tree(pre, pre_start+1, pre_start+left_length, tin, tin_start, tin_mid-1) head.right = self.rebuild_tree(pre,pre_start+left_length+1, pre_end, tin, tin_mid+1, tin_end) return head def post_order_print(head): """之後序遍歷的方式打印一顆二叉樹""" if head is None: return post_order_print(head.left) post_order_print(head.right) print(head.val,end='') if __name__ == '__main__': pre = 'ABDEGCFH' tin = 'DBGEACHF' s = Solution() head = s.reConstructBinaryTree(pre, tin) post_order_print(head) # result: DGEBHFCA
道理是同樣的,根據後序遍從來肯定根節點的位置,因爲後序遍歷最後訪問根節點, 因此此時最後一個節點就是根節點。根據中序遍從來劃分左右子樹,而後迭代求解。遞歸
前序和後序在本質上都是將父節點與子結點進行分離,但並無指明左子樹和右子樹的能力,所以獲得這兩個序列只能明確父子關係,而不能肯定一個二叉樹。
好比前序遍歷爲ABC,後續遍歷爲CBA,能夠構造出下面兩棵樹,能夠發現這並不惟一:
it