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

输出二叉树的右视图

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

import java.util.*;


class Node {
    int val ;
    Node left ;
    Node right ;
    Node() {}
    Node(int val) {this.val = val ;}
}
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型一维数组 先序遍历
     * @param zhongxu int整型一维数组 中序遍历
     * @return int整型一维数组
     */
    public int[] solve (int[] xianxu, int[] zhongxu) {
        //创建二叉树
        Node head = createTree(xianxu , zhongxu , 0 , 0 , xianxu.length) ;
        //求右视图(层序遍历)
        ArrayList<Integer> rightViewList = new ArrayList<>() ;
        Queue<Node> que = new LinkedList<>() ;
        que.offer(head) ;
        while(!que.isEmpty()) {
            //每一层的节点数
            int cur_row_len = que.size() ;
            for(int i = 0 ; i < cur_row_len ; i ++) {
                Node tmp = que.poll() ;
                //将每层最后一个节点加入右视图中
                if(i == cur_row_len - 1) rightViewList.add(tmp.val) ;
                if(tmp.left != null) que.offer(tmp.left) ;
                if(tmp.right != null) que.offer(tmp.right) ;
            }
        }
        int [] res = new int[rightViewList.size()] ;
        for(int i = 0 ; i < res.length ; i ++) {
            res[i] = rightViewList.get(i) ;
        }
        return res ;
    }
    //创建二叉树
    public Node createTree(int[] pre , int[] in , int preIdx , int inIdx , int len) {
        if(len == 0) return null ;
        Node root = new Node(pre[preIdx]) ;
        //寻找root在中序遍历序列中的位置
        int i = inIdx ;
        for(; i < inIdx + len ; i ++) {
            if(in[i] == root.val) break ;
        }
        int l_len = i - inIdx ;
        int r_len = len - l_len - 1 ;
        root.left = createTree(pre , in , preIdx + 1 , inIdx , l_len) ;
        root.right = createTree(pre , in , preIdx + l_len + 1 , i + 1 , r_len) ;
        return root ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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