通过前序和中序构建二叉树同上一题。
求二叉树的右视图可以用层次遍历,找到每一层的最后一个结点并把它并入结果集。



public class Solution {
    public int[] solve (int[] xianxu, int[] zhongxu) {
        // write code here
        TreeNode root = buildTreeByPreorderAndInorder(xianxu, 0, xianxu.length - 1, zhongxu, 0, zhongxu.length - 1);
        return BFS(root);
        
    }
    
    private int[] BFS(TreeNode root){
        if(root == null){
            return new int[0];
        }
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int currLevelNodeNum = queue.size();
        List<Integer> list = new ArrayList<>();
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            currLevelNodeNum--;
            // 当前层所有结点都已出队,说明该结点为该层最后一个结点
            if(currLevelNodeNum == 0){
                list.add(node.val);
            }
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
            if(currLevelNodeNum == 0){
                currLevelNodeNum = queue.size();
            }
        }
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            res[i] = list.get(i);
        }
        return res;
    }
    
    private TreeNode buildTreeByPreorderAndInorder(int[] pre, int l1, int r1, int[] vin, int l2, int r2){
        if (l1 > r1 || l2 > r2) {
            return null;
        }
        int i;
        for (i = l2; i <= r2; i++) {
            if (vin[i] == pre[l1]) {
                break;
            }
        }
        TreeNode node = new TreeNode(pre[l1]);
        node.left = buildTreeByPreorderAndInorder(pre, l1 + 1, l1 + i - l2, vin, l2, i - 1);
        node.right = buildTreeByPreorderAndInorder(pre, l1 + i - l2 + 1, r1, vin, i + 1, r2);
        return node;
    }
}