public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve (int[] xianxu, int[] zhongxu) {
        // write code here
        TreeNode root=reCons(xianxu,zhongxu);
        return view(root);
    }
    //构造二叉树
    public TreeNode reCons(int[] xianxu,int[] zhongxu){
        if(xianxu==null||xianxu.length==0) return null;
        int i;
        TreeNode root=new TreeNode(xianxu[0]);
        for(i=0;i<zhongxu.length;i++){
            if(zhongxu[i]==xianxu[0]){
                root.left=reCons(Arrays.copyOfRange(xianxu,1,1+i),Arrays.copyOfRange(zhongxu,0,i));
                root.right=reCons(Arrays.copyOfRange(xianxu,1+i,xianxu.length),Arrays.copyOfRange(zhongxu,i+1,zhongxu.length));
                break;
            }
        }
        return root;
    }
    //层序遍历,每层的最后一个结点的值存入list
    public int[] view(TreeNode root){
        if(root==null) return null;
        List<Integer> list=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            //记录当前层的结点数
            int size=queue.size();
            TreeNode tempNode=null;
            while(size-->0){
                tempNode=queue.poll();
                if(tempNode.left!=null) queue.offer(tempNode.left);
                if(tempNode.right!=null) queue.offer(tempNode.right);
            }
            list.add(tempNode.val);
        }
        int[] res=new int[list.size()];
        for(int i=0;i<res.length;i++){
            res[i]=list.get(i);
        }
        return res;
    }
}