LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal

原题

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
        

  

原文地址:https://www.cnblogs.com/LiCheng-/p/6625234.html