当前位置: 首页 > news >正文

【LeetCode】199.二叉树的右视图

1.问题

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

示例 1:

在这里插入图片描述

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

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

2.解题思路

经历过前面几篇关于二叉树的层序遍历算法之后(参见102.二叉树的层序遍历,107.二叉树的层序遍历II),非常容易的就可以通过这种算法解答此题,基本思想就是围绕队列性质,广度优先算法解决。当然,深度优先算法也是可以解决的。

2.1 广度优先(BFS)

利用队列,遍历每层节点,并记录每层最后一个元素,直到遍历完最后一层,即可得到结果。访问顺序如下图所示:
在这里插入图片描述
红色结点自上而下组成答案,边缘以访问顺序标号。
复杂度

  • 时间复杂度: O(N),每个节点都入队出队了 1 次。
  • 空间复杂度: O(N),使用了额外的队列空间。

2.2 深度优先(DFS)

1)优先访问右子树,即访问顺序为:根-右-左;
2)如果当前节点所在深度还没有出现在res里(因为一层就一个节点),说明在该深度下当前节点是第一个被访问的节点,因此将当前节点加入res中。

if len(res) < depth:res.append(root.val)
# 遍历右子树
if root.right:dfs(root.right, depth + 1, res)
# 遍历左子树
if root.left:dfs(root.left, depth + 1, res)

复杂度

  • 时间复杂度: O(N),每个节点都访问了 1 次。
  • 空间复杂度: O(N),因为这不是一棵平衡二叉树,二叉树的深度最少是 logN, 最坏的情况下会退化成一条链表,深度就是N,因此递归时使用的栈空间是 O(N) 的。

3.代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {/**广度优先1.利用层序遍历思想,统计每层最后一个元素,即为答案2.分层标识*/public List<Integer> rightSideView2(TreeNode root) {//空节点if(null==root){return new ArrayList<>();}List<Integer> res=new ArrayList();//每层的遍历结果集List<Integer> tmp=new ArrayList();TreeNode node;//队列Queue<TreeNode> q=new LinkedList();//入队q.add(root);//分层标识q.add(null);while(!q.isEmpty()){node=q.poll();if(null!=node){tmp.add(node.val);//左右子树入队if(null!=node.left){q.add(node.left);}if(null!=node.right){q.add(node.right);}}//否层,该层遍历完毕else{if(!tmp.isEmpty()){//收集每层最后一个元素res.add(tmp.get(tmp.size()-1));tmp=new ArrayList();q.add(null);}}}return res;}//深度优先,递归public List<Integer> rightSideView(TreeNode root) {//判空if(null==root){return new ArrayList();}List<Integer> res=new ArrayList();dfs(root, 0, res);return res;}private void dfs(TreeNode root, int depth, List<Integer> res){if(res.size()==depth){res.add(root.val);}//左右子树,先遍历右子树,然后左子树if(null!=root.right){dfs(root.right, depth+1, res);}if(null!=root.left){dfs(root.left, depth+1, res);}}
}
http://www.lryc.cn/news/61359.html

相关文章:

  • Shell编程(三)grep sed awk文本处理三剑客
  • 一步步带你学习Python编程:从零开始的查缺补漏
  • 常见容器的方法
  • 【Linux】线程
  • ASP.NET Core MVC 从入门到精通之wwwroot和客户端库
  • Oracle OCI 修改 Compute Instance Hostname
  • 垃圾收集算法面试总结
  • grep替换指定字符串方法
  • 主从模式、哨兵模式、集群模式(cluster)
  • 题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题
  • Java 文件操作
  • 二叉树OJ题(C++实现)
  • grep -nr 命令查询字符串方式
  • AgentAI+ChatGPT给出答案-为什么即时通讯需要心跳
  • 跨平台跨端的登录流程及其安全设计
  • 如何在Java中创建临时文件?
  • Vue表单基本操作-收集表单数据
  • Android 一个获取网址时间的Demo
  • ijkplayer解码流程源码解读
  • 2023年值得关注的3个品牌趋势,帮你弯道超车
  • 软考-高级项目管理(二十)
  • RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术
  • 2023mathorcup数学建模ABCD思路分析
  • 普通家庭,千万不要投入大量时间和金钱,让孩子去苦学和培养AI机器人编程了...
  • C++学习(day2)
  • 软考 - IP地址与网络划分
  • Apifox软件的基础使用方式
  • 【Tensorflow】模型如何加载HDF文件数据集?
  • 校招又临近了,怎么在面试中应对设计模式相关问题呢?
  • padans关于数据处理的杂谈