#


# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求二叉树的右视图
# @param preOrder int整型一维数组 先序遍历
# @param inOrder int整型一维数组 中序遍历
# @return int整型一维数组
#

"""
参考力扣 leetcode105官方视频: 
 1. 前序比遍历的第一个节点是是根节点
   前序遍历:
   [根] [左子树根 --左子树] [右子树根 ---右子树]
   设 前序开始位置preleft  结束位置为preright
   []
 2. 中序遍历
   [左子树]  [根] [ 右子树]
   设中序的起始位置inleft 中序结束位置 inright
 3. 在中序从左到右遍历找到根节点位置 inorder_root位置  ----可以提前用哈希表存储中序中的
 中序 :[inorder_left ...inorder_root-1] [inorder_root] [inderer_root+1....inorder_right ]
 4 前序中右子树的根位置怎么找? 
  preorder_left  [preorder_left+1.......x][x+1 ........preorder_right]

  可以利用前序中左子树长度等于 中序左子树长度
     [preorder_left+1.......x] =[inorder_left ...inorder_root-1]

     x-(preorder_left+1 )=inorder_root-1-inorder_left 
     得到x =inorder_root-inorder_left+preorder_left
     所以在前序中右子树的开始位置为x+1 : inorder_root-inorder_left+preorder_left+1

  5. 递归结束条件 preorder_left>preright


"""
class Solution:

    # 使用BM40方法建树
    # 层序遍历 取右端点
    def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
        # write code here
        # 建立一个map 保存中序遍历的所有节点 方便查找root 节点
        map=dict()
        for i in  range(len(inOrder)):
            map[inOrder[i]]=i
        #print(map)
        def buildtree(preOrder,preorder_left,preorder_right,inOrder,inorder_left,inorder_right):
            # 递归结束条件
            if preorder_left>preorder_right:
                return 
            # 取出前序遍历的第一个元素为根节点
            preorder_root =preorder_left
            # c创建 root 
            
            root =TreeNode(preOrder[preorder_root])
            # map中找root 节点的位置
            inoreder_root=map[preOrder[preorder_root]]
            #print("root",root.val)
            #print("inorde root",inoreder_root,preorder_left)
            # 递归左子树
                              #前序
            root.left =buildtree(preOrder,preorder_left+1,inoreder_root-inorder_left+preorder_left,inOrder,inorder_left,inoreder_root-1)
            # 递归右子树
            root.right =buildtree(preOrder,inoreder_root-inorder_left+preorder_left+1,preorder_right,inOrder,inoreder_root+1,inorder_right)
            return  root 

        res=[]
        import collections
        def dfs(root):
            if not root:
                return
            dq=collections.deque()
            dq.append(root)

            while dq: 
                vals=[] # 每层的值
                # 一层的父节点的个数
                n=len(dq)
                print("dq",len(dq))
                for i in range(n):
                    node =dq.popleft()
                    vals.append(node.val )
                    if node.left:
                        dq.append(node.left)
                    if node.right:
                        dq.append(node.right)
                res.append(vals)
        root =buildtree(preOrder,0,len(preOrder)-1,inOrder,0,len(inOrder)-1)
        dfs(root)
        print(res)
        ret=[]
        for level in res :
            ret.append(level[-1])
        return ret