当前位置: 首页 > 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);}}
}

相关文章:

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

1.问题 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: []…...

Shell编程(三)grep sed awk文本处理三剑客

上一章&#xff1a; Shell编程(二&#xff09;_做测试的喵酱的博客-CSDN博客 一、ps命令 指令&#xff1a; ps作用&#xff1a; 主要是查看服务器的进程信息选项含义&#xff1a; -e&#xff1a;等价于 ‘-A’ &#xff0c;表示列出全部的进程 -f&#xff1a;显示全部的列&am…...

一步步带你学习Python编程:从零开始的查缺补漏

在快节奏的生活中&#xff0c;很难找到时间来学习新的技能。但有时候&#xff0c;我们会突然发现自己有一些空闲时间&#xff0c;而又不想虚度光阴。无聊的时候&#xff0c;我们可以选择学习一项新技能来充实自己。最近&#xff0c;我就因为有些无聊&#xff0c;决定重新学习Py…...

常见容器的方法

常见容器 向量 (vector)常用方法代码实例 列表 (list)常用方法 集合 (set)常用方法 映射 (map)方法 向量 (vector) 常用方法 vector::push_back(): 将元素插入向量尾部。 vector::pop_back(): 弹出向量尾部的元素。 vector::insert(): 在指定位置插入元素。 vector::erase():…...

【Linux】线程

1.理解地址空间和页表 1.地址空间是进程能够看到的资源窗口 2.页表决定进程真正拥有的资源情况 3.合理的对地址空间和页表进行资源划分就可以对一个进程的所有资源进行划分&#xff1a;过地址空间分为栈区、堆区…通过页表映射到不同的物理内存。 在32位平台下&#xff0c;…...

ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…...

Oracle OCI 修改 Compute Instance Hostname

Oracle OCI 修改 Compute Instance Hostname Oracle Linux 7 及之后的版本 Oracle Linux 7 及之后的版本 1, Update the /etc/hostname file with below command. hostnamectl set-hostname <new name>2, Edit the oci configuration file for hostnames as given belo…...

垃圾收集算法面试总结

垃圾收集算法 标记 - 清除算法 首先标记出所有需要被回收的对象&#xff0c;标记完后统一回收所有被标记的对象。 后续的收集算法都是基于这种思路并对其不足进行改进而得到的。 这种方法主要有两个缺点&#xff1a; 一个是效率问题&#xff0c;标记和清除两个过程的效率都…...

grep替换指定字符串方法

在 Linux 命令行中&#xff0c;可以使用 grep 命令来查找匹配某个模式的字符串&#xff0c;并将其替换为另一个字符串。具体方法如下&#xff1a; grep -rl <pattern> <directory> | xargs sed -i s/<old_string>/<new_string>/g其中&#xff0c;<…...

主从模式、哨兵模式、集群模式(cluster)

主从模式、哨兵模式、集群模式&#xff08;cluster&#xff09; redis 实现高可用的方式分为 主从模式、哨兵模式、集群模式&#xff08;cluster&#xff09; 1. 主从模式&#xff08;又称为主从复制&#xff09; 表现为1个主节点&#xff0c;多个从节点&#xff0c;主节点负…...

题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

原题链接 https://www.dotcpp.com/oj/problem3162.html 想直接看题解的&#xff0c;跳转到第三次尝试即可。 已AC。 解析&#xff1a; &#xff08;1&#xff09;首先大家要知道什么叫互质&#xff1a; 以及它们的性质&#xff1a; 欧拉函数 在数论中&#xff0c;对正整…...

Java 文件操作

字符流-Writer和Reader用于读取文本-BufferedReader(new FileReader("path")) 读取文本文件-BufferedWriter(new FileWriter("path")) 写入到文本文件 字节流-InputStream和OutputStream图片、二进制文件-BufferedInputStream(new FileInputStream(new F…...

二叉树OJ题(C++实现)

文章目录 1.二叉树的层序遍历2. 二叉树的最近公共祖先3.二叉搜索树与双向链表4.从前序与中序遍历序列构造二叉树 1.二叉树的层序遍历 二叉树的层序遍历 OJ连接 主要思路是借助一个队列&#xff0c;将每一层的数据以size统计&#xff0c;当size为0时说明该层数据已经输入完&…...

grep -nr 命令查询字符串方式

grep -nr “搜索内容” 文件路径 其中&#xff1a; -n&#xff1a;显示行号-r&#xff1a;递归查找子目录中的文件“搜索内容”&#xff1a;要搜索的内容文件路径&#xff1a;要搜索的文件路径&#xff0c;可以是单个文件或目录路径&#xff08;将会递归搜索该目录下的所有文…...

AgentAI+ChatGPT给出答案-为什么即时通讯需要心跳

序言 人工智能ChatGpt 结合系统化的问题拆解, 现在已经能够进行问题的拆解与自问自答, 预计未来很多的脑力工作要被释放了, 作为即时通讯的开发人员, 我问问专业的问题 为什么即时通讯需要心跳 先看产品界面与使用结果 问题拆解过程 执行任务1: 概念搜索 “Executing “Res…...

跨平台跨端的登录流程及其安全设计

跨平台跨端的登录流程及其安全设计 目录 跨平台跨端的登录流程及其安全设计 一、登录流程 1.1、登录流程时序图 1.2、三方App 登录 1.3、请求的路由守卫 二、注册流程 2.1、注册流程时序图 2.2、多因素认证 2.3、自动跳转登录页面 三、涉及的技术与安全 3.1、用户…...

如何在Java中创建临时文件?

在Java程序中&#xff0c;有时需要创建临时文件来暂存数据或者执行某些操作。Java提供了许多方式来创建临时文件。在本教程中&#xff0c;我们将介绍如何使用Java标准库来创建临时文件。 一、使用File.createTempFile()方法 Java标准库中的File类提供了createTempFile()方法来…...

Vue表单基本操作-收集表单数据

收集表单数据 使用vue中的v-model收集表单里面的数据&#xff0c;不同的表单元素配合v-model会有不同的写法和技巧 本次的表单元素包括&#xff1a;文本框&#xff0c;单选&#xff0c;多选&#xff0c;下拉框&#xff0c;文本域 编写表单元素 首先编写表单元素&#xff0c;…...

Android 一个获取网址时间的Demo

Android 一个获取网址时间的Demo 文章目录 Android 一个获取网址时间的Demo通过一个网址获取时间的代码关于Android NTP 时间Android 同步时间代码 前段时间有个客户想用局域网同步Android 设备的时间&#xff0c;开发后把这个demo分享一下。 效果&#xff1a; 这里也获取了阿…...

ijkplayer解码流程源码解读

ijkplayer是一款基于ffmpeg的在移动端比较流行的开源播放器。FFmpeg是一款用于多媒体处理、音视频编解码的自由软件工程&#xff0c;采用LGPL或GPL许可证。 要想理解ijkplayer源码&#xff0c;首先得知道视频播放器的基本原理。 视频播放器播放一个互联网上的视频文件&#xf…...

别再死磕官方文档了!R语言circlize包画圈图,这份新手避坑笔记帮你省下三天时间

R语言circlize包实战指南&#xff1a;从挫败感到高效绘图的进阶之路 第一次打开circlize包的官方文档时&#xff0c;那种扑面而来的复杂参数和抽象概念让人望而生畏。作为生物信息学分析中常用的环形可视化工具&#xff0c;circlize包在基因组数据展示、多维度数据关联分析等领…...

Cursor智能体学习工具:构建专属AI编程知识库的完整指南

1. 项目概述&#xff1a;一个为开发者量身定制的Cursor智能体学习工具如果你是一名开发者&#xff0c;并且最近正在尝试使用Cursor这款AI编程工具&#xff0c;那么你很可能和我一样&#xff0c;经历过一个既兴奋又有点迷茫的阶段。Cursor的强大毋庸置疑&#xff0c;它能理解上下…...

Android 显示框架:SurfaceFlinger与合成策略探析

1. SurfaceFlinger的核心角色解析 第一次拆解Android显示系统时&#xff0c;我被SurfaceFlinger这个名称逗笑了——"Surface抛洒者"&#xff1f;后来发现这个命名意外地准确。想象你正在布置多屏艺术展&#xff0c;SurfaceFlinger就是那个决定每幅画作展示位置、叠加…...

MAA助手:解放双手的明日方舟全自动游戏管理工具实战指南

MAA助手&#xff1a;解放双手的明日方舟全自动游戏管理工具实战指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…...

如何用LinkSwift解锁九大网盘下载新姿势?完整攻略揭秘

如何用LinkSwift解锁九大网盘下载新姿势&#xff1f;完整攻略揭秘 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

3分钟解决Visual C++运行库问题:一站式安装修复工具完全指南

3分钟解决Visual C运行库问题&#xff1a;一站式安装修复工具完全指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾被"找不到msvcp140.dll"…...

为ESP32智能灯光项目3D打印定制保护外壳:从设计到实战

1. 项目概述与核心价值如果你正在玩智能灯光项目&#xff0c;尤其是基于ESP32和NeoPixel LED灯带&#xff0c;那么Adafruit的Sparkle Motion系列控制板大概率已经进入了你的视野。这是一块将ESP32-S3、电源管理、电平转换和LED驱动接口高度集成的“一体化”板卡&#xff0c;专为…...

【从零学Vibe Coding】第二章:大模型到底是怎么工作的(小白版)

第二章&#xff1a;大模型到底是怎么工作的&#xff08;小白版&#xff09; 为什么要了解原理&#xff1f; 很多人一边用 AI 写代码&#xff0c;一边又觉得它像魔法。魔法感越强&#xff0c;失望也越大。 因为一旦它出错&#xff0c;你就不知道问题出在哪&#xff0c;只能骂一…...

STM32F407驱动0.96寸OLED屏:除了SPI,你还可以试试这几种通信方式(I2C/8080对比)

STM32F407驱动0.96寸OLED屏&#xff1a;SPI、I2C与8080接口的深度技术选型指南 当你在STM32F407VET6核心板上连接0.96寸OLED模块时&#xff0c;第一个技术决策往往就是通信接口的选择。这个看似简单的选择实际上会影响整个项目的硬件设计复杂度、软件维护成本以及最终显示性能。…...

Midjourney v7艺术风格跃迁路径:从基础写实到超现实叙事的5阶能力模型,含GPT-4o协同提示链模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney v7艺术风格跃迁路径总览 Midjourney v7 并非简单迭代&#xff0c;而是以扩散模型架构重构与多模态风格理解为内核的范式跃迁。其核心突破在于引入「语义风格锚点&#xff08;Semantic Style…...