看见进步:

真棒,Good job! 这次是自己做出整个二叉树的最后一道题目了,都是前面所有的题目,积累的知识厚积薄发,带来的效果,真棒!真棒!真棒!棒棒棒!

解题思路:

1、用BM40的思路,重构二叉树

2、用层次遍历的方法,获得最有子节点

import java.util.*;


public class Solution {
    /*
     * 求二叉树的右视图
     * @param preOrder int整型一维数组 先序遍历
     * @param inOrder int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve (int[] preOrder, int[] inOrder) {
        TreeNode root = deConstructTreeNode(preOrder,inOrder);
        ArrayList<Integer> res = getSloveArray(root);
        int[] resArr = res.stream().mapToInt(i->i).toArray();
        return resArr;
    }

    /**
     * 层次遍历整个二叉树,获得最后一个节点
     */
    public ArrayList<Integer> getSloveArray(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(root == null) {
            return res;
        }

        ArrayDeque<TreeNode> q = new ArrayDeque<>();
        q.offer(root);
        while(!q.isEmpty()) {
            int n = q.size();
            for(int i=0; i<n; i++) {
                TreeNode node = q.poll();
                if(i== n-1) {
                    res.add(node.val);
                }
                if(node.left!=null) {
                    q.offer(node.left);
                }
                if(node.right!=null) {
                    q.offer(node.right);
                }
            }
        } 
        return res;

    }


    public TreeNode deConstructTreeNode(int[] pre, int[] vin) {
        int m = pre.length;
        int n = vin.length;
        if(m ==0 || n == 0) {
            return null;
        }

        TreeNode root = new TreeNode(pre[0]);
        for(int i=0; i<n; i++) {
            if(pre[0] == vin[i]) {
                root.left = deConstructTreeNode(
                    Arrays.copyOfRange(pre, 1, i+1),
                    Arrays.copyOfRange(vin, 0, i)
                );
                root.right = deConstructTreeNode(
                    Arrays.copyOfRange(pre, i+1, n),
                    Arrays.copyOfRange(vin, i+1, n)
                );
            }
        }
        return root;
    }


}