力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图

示例 1:

输入: [1,2,3,null,5,null,4] 输出: [1,3,4]

  • 想一想,从右往左看,看到的节点都有哪些特点呢?每一层都能且只能看到一个节点,且这个节点是每一层的最后一个节点。
  • 根据上面的分析,很显然用二叉树的层序遍历就行了当遇到每一层的最后一个节点时,就把该节点添加到结果数组即可。

这个添加时机是在中序位置还是后序?Q 前序?

左右中,在后续位置

  public int[] solve (int[] preOrder, int[] inOrder) {
 
        // write code here
 
        ArrayList<Integer>  res = new ArrayList<>();
 
        Queue<TreeNode>  queue = new LinkedList<>();
 
        TreeNode  root = reConstructBinaryTree(preOrder, inOrder);
 
        queue.add(root);
 
        if (preOrder.length == 0 || inOrder.length == 0) return new int[0];
 
        while (!queue.isEmpty()) {
 
            int n = queue.size();
 
            while (n-- > 0) {
 
                TreeNode temp = queue.poll();
 
                //最右元素
 
                if (n == 0)
 
                    res.add(temp.val);
 
                if (temp.left != null)
 
                    queue.offer(temp.left);
 
                if (temp.right != null)
 
                    queue.offer(temp.right);
 
            }
 
        }
 
        int n = res.size();
 
        int[] array = new int[n];
 
        for (int i = 0; i < n; ++i) {
 
            array[i] = res.get(i);
 
        }
 
        return array;
 
    }
 
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] inOrder) {
 
        // write code here
 
        int n = preOrder.length;
 
        int m =  inOrder.length;
 
        if (n == 0 || m == 0) return null;
 
        TreeNode root = new TreeNode(preOrder[0]);
 
        for (int i = 0; i <  inOrder.length; i++) {
 
            if (preOrder[0] ==  inOrder[i]) {
 
                root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i + 1),
 
                                                  Arrays.copyOfRange( inOrder, 0, i));
 
                root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i + 1,
 
                                                   preOrder.length),
 
                                                   Arrays.copyOfRange( inOrder, i + 1,  inOrder.length));
 
                break;
 
            }
 
        }
 
        return root;
 
    }