• 【LeetCode-中等题】199. 二叉树的右视图


    题目

    在这里插入图片描述

    方法一:层序遍历取每一层最后一个元素

    // 方法一 :层序 + 集合(取每层子集合最后一个元素)
        // List> Rlist = new ArrayList<>();
        // public List rightSideView(TreeNode root) {
        //     if(root == null ) return new ArrayList<>();
        //     Queue queue = new ArrayDeque<>();
        //     queue.offer(root); 
        //     while(!queue.isEmpty()){
        //         int count = queue.size();
        //         List res = new ArrayList<>();
        //         for(int i=0;i
        //             TreeNode node = queue.poll();
        //             res.add(node.val);
        //         if(node.left != null) queue.offer(node.left);
        //         if(node.right != null) queue.offer(node.right);
        //         }
        //         Rlist.add(res);//每层节点集合加入到大集合
        //     }
        //       List result = new ArrayList<>();//结果集
        //     for(List list : Rlist ){
        //         result.add((Integer)list.get(list.size()-1));//取每层集合最后一个元素
        //     }
        //     return result;
        // }
    // 方法一(优化) :在层序遍历的时候直接要每一层的最后一个元素加入集合  就不需要把一层所有节点的加入集合再去取每层集合最后一个了
        public List<Integer> rightSideView(TreeNode root) {
            List<Integer> Rlist = new ArrayList<>();//结果集
            if(root == null ) return Rlist;
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.offer(root); 
            while(!queue.isEmpty()){
                int count = queue.size();
                for(int i=0;i<count;i++){
                    TreeNode node = queue.poll();
                    if(i == count -1)//只取一层最后一个元素(count)
                    Rlist.add(node.val);
                if(node.left != null) queue.offer(node.left);
                if(node.right != null) queue.offer(node.right);
                }
            }
            return Rlist;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    方法二:深度优先搜索

    根 右 左 的顺序 取每层第一个被访问到的节点(depth == list.size())
    在这里插入图片描述

       List<Integer> result = new ArrayList<>();
        public List<Integer> rightSideView(TreeNode root) {
           dfs(root,0);//起始递归 root  深度为0
           return result;
        }
    
        public void dfs(TreeNode tree ,int  depth){
            if(tree == null) return ;
    
            if(depth == result.size()) result.add(tree.val);//若当前深度 = 集合的大小,说明在该层还没加入任何元素,此时只需加入第一次访问的元素就行
            dfs(tree.right,depth+1);//切换到下一层继续找第一次访问的元素
            dfs(tree.left,depth+1);//切换到下一层继续找第一次访问的元素
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    『现学现忘』Git分支 — 40、分支基本操作(一)
    GenericWriteAheadSink每次checkpoint后事务是否必须成功
    设计模式:组合模式
    3.harbor仓库安装
    华为机试真题 Python 实现【最大平分数组】【2022.11 Q4新题】
    代码随想录1刷—链表篇
    《opencv学习笔记》-- 图像修补
    四年时间,从一个浑浑噩噩的程序员到csdn博客专家的成长之路
    苹果入局AI手机 iOS 18将应用AI功能
    300题线性代数 第四讲 线性方程组
  • 原文地址:https://blog.csdn.net/weixin_45618869/article/details/132582194