[LC] 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.

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder or not inorder:
            return
        my_dict = {}
        for i, node in enumerate(inorder):
            my_dict[node] = i
        return self.helper(0, preorder, 0, len(inorder) - 1, inorder, my_dict)

    
    def helper(self, pre_left,  preorder, in_left, in_right, inorder, my_dict):
        if in_right < in_left:
            return None
        cur_val = preorder[pre_left]
        cur = TreeNode(cur_val)
        left_size = my_dict[cur_val] - in_left
        in_index = my_dict[cur_val]
        
        cur.left = self.helper(pre_left + 1, preorder, in_left, in_left + left_size - 1, inorder, my_dict)
        # For pre_left, need to add 1 in additional to left_size
        cur.right = self.helper(pre_left + left_size + 1, preorder, in_left + left_size + 1, in_right, inorder, my_dict)
        return cur

 

posted @ 2019-10-28 10:57  xuan_abc  阅读(73)  评论(0编辑  收藏  举报