原题
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
解题思路
代码实现
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def help1(self, pre, begin1, end1, ino, begin2, end2): if(begin1 > end1): return None elif(begin1 == end1): return TreeNode(pre[begin1]) root = TreeNode(pre[begin1]) temp = pre[begin1] index = begin2 for i in ino: if temp == i: break index += 1 length = index - begin1 root.left = self.help1(pre, begin1+1, begin1+length, ino, begin2, begin2+length-1) root.right = self.help1(pre, begin1+length+1, end1, ino, begin2+length+1, end2) return root def buildTree(self, preorder, inorder): """ :type preorder: List[int] :type inorder: List[int] :rtype: TreeNode """ return self.help1(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1) # // 上面的解法用c++是可以ac的,但是python默认的递归深度只有900(这里不能调整),所以会显示maximum recursion depth exceeded # 方法二 # class Solution(object): # def buildTree(self, preorder, inorder): # """ # :type preorder: List[int] # :type inorder: List[int] # :rtype: TreeNode # """ # root = None # 边界条件是inorder为空,而不是preorder,因为若为preoder则左子树完成后跳不出循环 # if inorder: # index = inorder.index(preorder[0]) # # 这里方法很巧妙,每次我都删掉,left递归回来的时候左子树正好删完了 # del preorder[0] # root = TreeNode(inorder[index]) # root.left = self.buildTree(preorder, inorder[:index]) # root.right = self.buildTree(preorder, inorder[index+1:]) # return root