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

news2024/11/30 12:45:24

题目难度: 中等

原题链接

今天继续更新 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]:
        # 按层BFS
        res = []
        if not root:
            # 根节点为空, 返回空列表
            return res
        # 队列初始化为第一层, 即根节点
        q = [root]
        while q:
            # 记录当前层的节点个数curlen
            curlen = 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.coloradmin.cn/o/1051813.html

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

相关文章

【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器

AnimatableExtend装饰器用于自定义可动画的属性方法&#xff0c;在这个属性方法中修改组件不可动画的属性。在动画执行过程时&#xff0c;通过逐帧回调函数修改不可动画属性值&#xff0c;让不可动画属性也能实现动画效果。 可动画属性&#xff1a;如果一个属性方法在animation…

批量剪辑视频软件,支持免费试用,合成视频,预览不限量不收费

几乎对于所有的短视频创作者来说&#xff0c;批量剪辑软件都是现在或者将来必备的办公软件。现如今市场上的批量剪辑软件也是层出不穷&#xff0c;质量也是良莠不齐。 今天给大家实实在在的推荐一款性价比非常高的批量剪辑软件——超级编导&#xff0c;适用于既想提升团队视频…

volatile关键字以及使用场景

在多线程环境下&#xff0c;如果编程不当&#xff0c;可能会出现程序运行结果混乱的问题。 出现这个原因主要是&#xff0c;JMM 中主内存和线程工作内存的数据不一致&#xff0c;以及多个线程执行时无序&#xff0c;共同导致的结果。 同时也提到引入synchronized同步锁&#x…

Android Studio插件版本与Gradle 版本对应关系

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、Gradle各版本对应关系3.1 Gradle 版…

杀掉进程但是fastapi程序还在运行

两个脚本&#xff0c;一个运行fastapi服务&#xff0c;一个重启服务&#xff1a; 启动服务先&#xff1a; 发现问题&#xff0c;杀掉 server.sh 后&#xff0c;依旧有&#xff1a; 不知道为什么会出现这个&#xff0c;直接kill吧&#xff1a; server.sh: #!/bin/bashparpath/…

Unity/WebGL打包/跨域问题/简单解决“......has been blocked by CORS policy: ......“

报错原文&#xff1a; Access to XMLHttpRequest atfile:///C:/Users/13171/My%20project%20(1)/Test/Build/test.data.gz from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-e…

NX 1988 如何将组件转为部件

打开组件 文件-导出-部件 指定部件名为1206&#xff0c;类选择&#xff1a;所有要导出的部件 选择完全加载 完成

(vue3)create-vue 组合式APIsetup、ref、watch,通信

优势&#xff1a; 更易维护&#xff1a;组合式api&#xff0c;更好的TS支持 之前是选项式api&#xff0c;现在是组合式&#xff0c;把同功能的api集合式管理 复用功能封装成一整个函数 更快的速度 更小的体积 更优的数据响应式&#xff1a;Proxy create-vue 新的脚手架工…

vue前端项目中添加独立的静态资源

如果想要在vue项目中放一些独立的静态资源&#xff0c;比如html文件或者用于下载的业务模板或其他文件等&#xff0c;需要在vue打包的时候指定一下静态资源的位置和打包后的目标位置。 使用的是 copy-webpack-plugin 插件&#xff0c;如果没有安装则需要先安装一下&#xff0c;…

Pikachu靶场——PHP反序列化漏洞

文章目录 1. PHP反序列化1.1 反序列化代码审计1.2 漏洞防御 1. PHP反序列化 可参考我写的另一篇博客&#xff1a;反序列化漏洞及漏洞复现。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串&#xff0c;比如下面是一个对象&#xff1a; class S{publi…

Push rejected: Push to origin/master was rejected

Push rejected: Push to origin/master was rejected 原因&#xff1a;推拒绝&#xff1a;推送到起源/主人被拒绝 解决方案如下&#xff1a; 方案1&#xff1a; 1.在Idea打开终端 方案2&#xff1a; 1、在对应项目文件里打开 Git Bash 然后依次输入&#xff1a; git pull …

【数据结构--八大排序】之堆排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Databend 开源周报第112期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解用户自定义…

【GDB】使用 GDB 自动画红黑树

阅读本文前需要的基础知识 用 python 扩展 gdb python 绘制 graphviz 使用 GDB 画红黑树 前面几节中介绍了 gdb 的 python 扩展&#xff0c;参考 用 python 扩展 gdb 并且 python 有 graphviz 模块&#xff0c;那么可以用 gdb 调用 python&#xff0c;在 python 中使用 grap…

MathType7.4最新版本下载安装教程来咯!

MathType是全球领先的所见即所得公式编辑器&#xff0c;支持书写任何类型的数学方程式。 MathType曾作为Microsoft Word内置公式编辑器&#xff0c;与微软办公套件完美兼容&#xff0c;支持WPS&#xff0c;亦可以独立单机软件使用。是为数学理工经济学习研究、学术发表的有力拍…

echarts使用custom类型绘制矩形

echarts中根据坐标点和点的宽高绘制不同大小的矩形 效果图 <template><div style"height: 100%; width: 100%"><BaseChart emitChart"emitChart" :option"option1" /></div> </template><script> export …

基于Web的在线学习平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

lwIP 开发指南(中)

目录 ARP 协议ARP 协议的简介ARP 协议的工作流程(获取目标设备 MAC 地址步骤)ARP 缓存表的超时处理 APR 报文的报文结构ARP 协议层的接收与发送原理解析发送ARP 请求数据包接收ARP 应答数据包 IP 协议IP 协议的简介IP 数据报IP 数据报结构IP 数据报的分片解析IP 数据报的分片重…

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…

深度学习笔记之优化算法(二)随机梯度下降

深度学习笔记之优化算法——随机梯度下降 引言回顾&#xff1a;梯度下降法梯度下降法在机器学习中的问题随机梯度下降随机梯度下降方法的思想随机梯度下降方法的步骤描述关于学习率 引言 本节将介绍随机梯度下降 (Stochastic Gradient Descent,SGD) \text{(Stochastic Gradien…