原题
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