題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
解題思路
用遞歸思想
前序遍歷是{1,2,4,7,3,5,6,8},中序遍歷是{4,7,2,1,5,3,8,6},可以知道1是根節點,則在中序遍歷中,4,7,2都是1的左子樹,5,3,8,6都是1的右子樹;從前序遍歷又可以知道2是1的左子節點,是1的左子樹中“根節點”的存在;3是1的右子節點,是1的右子樹中“根節點”的存在;因而可以不斷遞歸,直至明確每個節點的位置
給出代碼:
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # 返回構造的TreeNode根節點 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre) == 0: return None if len(pre) == 1: return TreeNode(pre[0]) else: res = TreeNode(pre[0]) res.left = self.reConstructBinaryTree(pre[1: tin.index(pre[0]) + 1], tin[: tin.index(pre[0])]) res.right = self.reConstructBinaryTree(pre[tin.index(pre[0]) + 1: ], tin[tin.index(pre[0]) + 1: ]) return res