二叉树的右视图和先重建二叉树,再打印二叉树的右视图(力扣199题、NC136题)

199.二叉树的右视图

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

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

   1            <---
 /   
2     3         <---
      
  5     4       <---

利用层次遍历寻找二叉树中的右视图(层次遍历,一次外循环遍历一层的节点,每层中最后一个访问的节点就是右视图的节点)

    public List<Integer> rightSideView(TreeNode root) {
        
        if(root == null){
            return new ArrayList<Integer>();
        }
        Queue<TreeNode> queue = new LinkedList<>();

        queue.offer(root);
        ArrayList<Integer> resList = new ArrayList<>();

        while (!queue.isEmpty()){

            int size = queue.size();

            while (size > 0){

                TreeNode node = queue.poll();
                if (size == 1){
                    resList.add(node.val);
                }

                if (node.left != null){
                    queue.offer(node.left);
                }

                if (node.right != null){
                    queue.offer(node.right);
                }
                size--;
            }
        }
        return resList;
    }

NC.136

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

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

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

   1            <---
 /   
2     3         <---
      
  5     4       <---

思路:

​ 1、依据先序遍历和中序遍历的结果重建二叉树;

​ 2、利用层次遍历寻找二叉树中的右视图(层次遍历,一次外循环遍历一层的节点,每层中最后一个访问的节点就是右视图的节点)

public int[] solve (int[] xianxu, int[] zhongxu) {
    // write code here

    TreeNode root = rebuildTree(xianxu,zhongxu,0,xianxu.length-1,0,zhongxu.length-1);

    return levelTrace(root);
}

private TreeNode rebuildTree(int[] xianxu, int[] zhongxu,int l1,int r1,int l2,int r2){

    if (l1 > r1 || l2 > r2){
        return null;
    }

    int rootValue = xianxu[l1];
    int rootInOrderIndex = -1;
    TreeNode root = new TreeNode(rootValue);

    for (int i = l2; i <= r2; i++) {

        if (rootValue == zhongxu[i]){
            rootInOrderIndex = i;
            break;
        }
    }

    int leftLength = rootInOrderIndex - l2;

    root.left = rebuildTree(xianxu,zhongxu,l1+1,l1+leftLength,l2,rootInOrderIndex-1);
    root.right = rebuildTree(xianxu,zhongxu,l1+leftLength+1,r1,rootInOrderIndex+1,r2);

    return root;
}

private int[] levelTrace(TreeNode root){

    if (root == null){
        return new int[]{};
    }

    Queue<TreeNode> queue = new LinkedList<>();

    queue.offer(root);
    ArrayList<Integer> resList = new ArrayList<>();

    while (!queue.isEmpty()){

        int size = queue.size();

        while (size > 0){

            TreeNode node = queue.poll();
            if (size == 1){
                resList.add(node.val);
            }

            if (node.left != null){
                queue.offer(node.left);
            }

            if (node.right != null){
                queue.offer(node.right);
            }
            size--;
        }
    }

    int[] res = new int[resList.size()];

    for (int i = 0; i < resList.size(); i++) {
        res[i] = resList.get(i);
    }

    return res;
}
原文地址:https://www.cnblogs.com/yxym2016/p/14496912.html