栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode--Java--199. 二叉树的右视图

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode--Java--199. 二叉树的右视图

题目描述

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

样例描述

思路

方法一:BFS

  1. 层序遍历,每次存下每一层的最后一个,就是右视图。
  2. 借助一个队列,注意是队列就不要使用push,pop这种方法,否则会当成栈。

方法二: DFS

  1. 将DFS的访问顺序改为根结点->右子树->左子树。保证每次都是先访问右边的,这样最后就是右视图。
  2. 注意可能会经过同一层很多次,但只用存下第一次访问的,所以设置一个depth变量记录当前深度,如果等于res说明结果集中该层还没有存储过,不等于说明已经存过了。
代码

BFS:

class Solution {
    public List rightSideView(TreeNode root) {
       List res = new ArrayList<>();
       Deque stack = new ArrayDeque<>();
       if (root != null) {
           stack.push(root);
       }
       while (!stack.isEmpty()) {
           int size = stack.size();
           for (int i = 0; i < size; i ++ ) {
               TreeNode node = stack.poll();
               if (node.left != null) {
                   stack.offer(node.left);
               }
               if (node.right != null) {
                   stack.offer(node.right);
               }
               //到这层的最后一个,加入结果集
               if (i == size - 1) {
                   res.add(node.val);
               }
           }
       }
       return res;
    }
}

DFS:

class Solution {
    List res = new ArrayList<>();
    public List rightSideView(TreeNode root) {
        dfs(root, 0);
        return res;
    }
    public void dfs(TreeNode root, int depth) {
        if (root == null) {
            return;
        }
        //看该层有没有存储过结点
        if (depth == res.size()) {
            res.add(root.val);
        }
        depth ++;
        //先遍历右子树,再遍历左子树
        dfs(root.right, depth);
        dfs(root.left, depth);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445352.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号