# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param preOrder int整型一维数组 
# @param vinOrder int整型一维数组 
# @return TreeNode类
#

"""
https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/submissions/636827642/


"""
class Solution:
    def reConstructBinaryTree(self , preOrder: List[int], vinOrder: List[int]) -> TreeNode:
        # write code here
        # 存储所有的中序遍历的节点
        map=dict()
        for i in range(len(vinOrder)):
            map[vinOrder[i]]=i
        
        # 递归辅助函数
        def buildhelp(preorder,preleft,preright,inorder,inleft,inright):
            if preleft>preright:
                return 
            # 前序遍历的第一个节点就是根节点位置
            preorder_root=preleft
            # 获取中序中根节点位置
            inorder_root=map[preorder[preorder_root]]
            # 创建根节点 
            root= TreeNode(preorder[preorder_root])
            #递归左子树
            root.left=buildhelp(preorder,preleft+1,inorder_root-inleft+preleft,inorder ,inleft,inorder_root-1) 
            root.right=buildhelp(preorder,inorder_root-inleft+preleft+1,preright,inorder,inorder_root+1,inright)
            return root
        root =buildhelp(preOrder,0,len(preOrder)-1,vinOrder,0,len(vinOrder)-1)
        return root