题解 | #输出二叉树的右视图#

输出二叉树的右视图

http://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    class TreeNode{
        private int val;
        private TreeNode left;
        private TreeNode right;
        public TreeNode(int val){
            this.val = val;
            left = null;
            right = null;
        }
    }
    List<Integer> list = new ArrayList<>();
    public int[] solve (int[] xianxu, int[] zhongxu) {
        // write code here
        TreeNode root = reConstructBinaryTree(xianxu,zhongxu);
        //按层遍历将每层最后一个加入到集合中
        if(root == null) return new int[]{};
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i = 0;i<size;i++){
                TreeNode cur = queue.poll();
                if(i==size-1){
                    list.add(cur.val);
                }
                if(cur.left != null){
                    queue.add(cur.left);
                }
                if(cur.right!=null){
                    queue.add(cur.right);
                }
            }
        }
        //将集合转化为数组
        int [] ans = new int[list.size()];
        for(int i = 0;i<ans.length;i++){
            ans[i] = list.get(i);
        }
        return ans;
        
    }
    //利用前序和中序遍历生成二叉树
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        if(pre == null||pre.length == 0){
            return null;
        }
        for(int i = 0;i<vin.length;i++){
            map.put(vin[i],i);
        }
        return binaryTree(pre,0,pre.length-1,vin,0,vin.length-1);
        
    }
    public TreeNode binaryTree(int[] pre,int preLeft,int preRight,int[] vin,int vinLeft,int vinRight){
        if(preLeft > preRight){
            return null;
        }
        TreeNode root = new TreeNode(pre[preLeft]);
        int index = map.get(pre[preLeft]);
        int size = index-vinLeft;
        root.left = binaryTree(pre,preLeft+1,preLeft+size,vin,vinLeft,index-1);
        root.right = binaryTree(pre,preLeft+size+1,preRight,vin,index+1,vinRight);
        return root;
    }
}
全部评论

相关推荐

07-23 18:25
河北大学 Java
点赞 评论 收藏
分享
07-25 13:42
门头沟学院 Java
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务