Leetcode 剑指 Offer II 046. 二叉树的右视图

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

  • 输入: root = [2,1,3]
  • 输出: 1

示例 2:

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

提示:

  • 二叉树的节点个数的范围是 [1,10^4]
  • -2^31 <= Node.val <= 2^31 - 1

题目思考

  1. 如何找出最底层?

解决方案

思路
  • 分析题目, 不难发现这道题和上一道题Leetcode 剑指 Offer II 045. 找树左下角的值非常类似, 只是把要求的最底层的最左节点换成了每一层的最右节点
  • 所以我们同样可以使用经典的按层 BFS 来解决, 具体思路如下:
    • 记录下当前层的节点边界, 并将当前层最后一个节点的值加入最终结果
    • 然后当前层的子节点都加入队列后, 将队列更新为从下一层节点起点开始
    • 这样队列变空后的最终结果就是整个二叉树的右视图
  • 具体实现细节如下:
    • 使用一个队列存储节点
    • 接下来开始循环, 记录当前队列长度 curlen
    • 然后遍历前 curlen 个节点, 并将它们的左右非空子节点追加到队列结尾
    • 另外当前层最后一个遍历到的节点就是其最右节点, 将它的值追加到 res 中
    • 当前层遍历结束时, 下层的起点下标自然就是 curlen, 所以只需要将队列切片成 curlen 及以后的部分即可
    • 最终当队列没有元素时则说明所有节点都遍历过了, 退出循环
    • 此时 res 保存的正是每一层最右节点的值
  • 由于这里是树, 所以每个节点只可能被加入队列访问一次, 无需额外的 visit 集合
  • 下面的代码就对应了上面的整个过程, 并且有详细的注释, 方便大家理解
复杂度
  • 时间复杂度 O(N): 需要遍历每个节点一遍
  • 空间复杂度 O(N): 需要存储所有节点到对应的层
代码
class Solution:def rightSideView(self, root: TreeNode) -> List[int]:# 按层BFSres = []if not root:# 根节点为空, 返回空列表return res# 队列初始化为第一层, 即根节点q = [root]while q:# 记录当前层的节点个数curlencurlen = len(q)# 将当前层最右侧的值加入最终结果中res.append(q[-1].val)# 只遍历当前层的节点, 即前curlen个for node in q[:curlen]:# 左右子节点非空时, 将其追加到队列中if node.left:q.append(node.left)if node.right:q.append(node.right)# 将队列更新成下一层的节点q = q[curlen:]# 最终res就是整个二叉树的右视图return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145577.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

【C++】C++11------线程库

目录 线程库接口线程接口使用lock_guard与unique_lockmutex(互斥锁)lock_guardunique_lock 原子性操作库条件变量(condition_variable) 线程库接口 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#x…

使用Python进行App用户细分

App用户细分是根据用户与App的互动方式对用户进行分组的任务。它有助于找到保留用户&#xff0c;找到营销活动的用户群&#xff0c;并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中&#xff0c;将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…

图片分割处理(以玉米颗粒的图片分割为例)

问题&#xff1a; 为完成玉米颗粒分类任务&#xff0c;现需要处理训练图片&#xff0c;将以下图片中的玉米颗粒进行分割&#xff1a; 目标&#xff1a; 操作步骤&#xff08;完整代码附在最后&#xff0c;该部分为解释说明&#xff09; 一、提取通道并进行二值化 # 提取蓝…

解决Nacos配置刷新问题: 如何启用配置刷新功能以及与`@RefreshScope`注解的关联问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

三、2023.9.29.C++面向对象.3

文章目录 33、简述一下什么是面向对象&#xff1f;34、简述一下面向对象的三大特征&#xff1f;35、简述一下 C 的重载和重写&#xff0c;以及它们的区别&#xff1f;36、说说 C 的重载和重写是如何实现的&#xff1f;37、说说构造函数有几种&#xff0c;分别什么作用?38、只定…

SpringBoot+MinIO8.0开箱即用的启动器

一、代码拉取及安装 1.码云地址 https://gitee.com/qiangesoft/rdp-starter/tree/master/rdp-starter-minio 2.本地安装 二、代码接入 存储路径规则可配置桶访问权限可配置可配置初始生成多个桶 1.引入依赖 <dependency><groupId>com.qiangesoft.rdp</gro…

会议AISTATS(Artificial Intelligence and Statistics) Latex模板参考文献引用问题

前言 在看AISTATS2024模板的时候&#xff0c;发现模板里面根本没有教怎么引用&#xff0c;要被气死了。 如下&#xff0c;引用(Cheesman, 1985)的时候&#xff0c;模板是自己手打上去的&#xff1f;而且模板提供的那三个引用&#xff0c;根本也没有Cheesman这个人&#xff0c…

Mybatis 二级缓存(使用Ehcache作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Ehcache作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.c…

Fake Maxpooling 二维滑动窗口

先对每一行求一遍滑动窗口&#xff0c;列数变为(列数-k1) 再对每一列求一遍滑动窗口&#xff0c;行数变为(行数-k1) 剩下的就是每一个窗口里的最大值啦 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing nam…

AIGC 绘画Stable Diffusion工具的安装与使用

我们先让ChatGPT来帮我们回答一下,什么是Stable Diffusion Stable Diffusion 是一种基于概率模型的图像生成技术。它通过对图像空间中每个像素的颜色值进行推断,从而生成具有高度真实感和细节的图像。 Stable Diffusion 使用一种称为扩散过程的方法来生成图像。在生成过程中…

测试用例的编写(面试常问)

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 作者简介&#xff1a;不断总结&#xff0c;才能变得更好~踩过的坑&#xff0c;不能再踩~ 文章简介&#xff1a;常见的几个测试用例。 一、淘宝购物车 二、登录页面 三、三角形测试用例 abc结果346普通三角形333等边三角形334…

【计算机网络笔记五】应用层(二)HTTP报文

HTTP 报文格式 HTTP 协议的请求报文和响应报文的结构基本相同&#xff0c;由四部分组成&#xff1a; ① 起始行&#xff08;start line&#xff09;&#xff1a;描述请求或响应的基本信息&#xff1b;② 头部字段集合&#xff08;header&#xff09;&#xff1a;使用 key-valu…

[JAVAee]MyBatis

目录 MyBatis简介 MyBatis的准备工作 框架的添加 连接数据库字符串的配置 MyBatis中XML路径的配置 ​编辑 MyBatis的使用 各层的实现 进行数据库操作 增加操作 拓展 修改操作 删除操作 查询操作 结果映射 单表查询 多表查询 like模糊查询 动态SQL / MyBa…

第7讲:VBA中利用FIND的代码实现单值查找实例

【分享成果&#xff0c;随喜正能量】心真如&#xff0c;随缘生起一切法&#xff0c;一切法还归于真如。《大乘起信论》讲心真如门就是体&#xff0c;心生灭门就是相用&#xff0c;心生灭、心真如都从一心而起&#xff0c;离开心别无二法。我们想从心真如门修行不易进入&#xf…

基于PHP+MySQL的家教平台

摘要 设计和实现基于PHP的家教平台是一个复杂而令人兴奋的任务。这个项目旨在为学生、家长和教师提供一个便捷的在线学习和教授平台。本文摘要将概述这个项目的关键方面&#xff0c;包括用户管理、课程管理、支付处理、评价系统、通知系统和安全性。首先&#xff0c;我们将建立…

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

小谈设计模式(6)—依赖倒转原则

小谈设计模式&#xff08;6&#xff09;—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…

正态分布的概率密度函数|多种正态分布检验|Q-Q图

正态分布的概率密度函数&#xff08;Probability Density Function&#xff0c;简称PDF&#xff09;的函数取值是指在给定的正态分布参数&#xff08;均值 μ 和标准差 σ&#xff09;下&#xff0c;对于特定的随机变量取值 x&#xff0c;计算得到的概率密度值 f(x)。这个值表示…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…