#输出二叉树的右视图# 分成两步走:1、递归重建二叉树(参考NC12重建二叉树)时间复杂度O(n),空间O(n)2、层序遍历(使用一个last指针记录每一层的最后一个节点,遍历到每层最后一个节点时,将其加入数组即可)时间复杂度O(n),空间O(n),总时间复杂度O(n),总空间复杂度O(n)



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve (int[] xianxu, int[] zhongxu) {
        // write code here
      TreeNode root  = reConstructTree(xianxu,zhongxu);
       List<TreeNode> list = new ArrayList<>();
        List<Integer> res = new ArrayList<Integer>();
        int front=0;
        int rear = 0;
        int last = 1;
        list.add(rear++,root);
        while(front!=rear){
            TreeNode p = list.get(front++);
            if(p.left!=null)list.add(rear++,p.left);
            if(p.right!=null)list.add(rear++,p.right);
            if(front==last){
                res.add(p.val);
                last = rear;
            }
        }
        int[] a=new int [res.size()];
        int i =0;
        for(int item:res){
            a[i++] =item; 
        }
        return a;
    }
    TreeNode reConstructTree(int[] xianxu, int[] zhongxu) {
        if(xianxu.length==0)return null;
        TreeNode root = new TreeNode(xianxu[0]);
        for(int i=0;i<zhongxu.length;++i){
            if(xianxu[0]==zhongxu[i]){
                root.left = reConstructTree(Arrays.copyOfRange(xianxu,1,i+1),Arrays.copyOfRange(zhongxu,0,i));
                root.right = reConstructTree(Arrays.copyOfRange(xianxu,i+1,xianxu.length),Arrays.copyOfRange(zhongxu,i+1,zhongxu.length));
            }
        }
        return root;
    }
}