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

【LeetCode热题100道笔记】二叉树的右视图

题目描述

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

示例 1:

输入:root = [1,2,3,null,5,null,4]
输出:[1,3,4]
解释:
在这里插入图片描述

示例 2:
输入:root = [1,2,3,4,null,null,null,5]
输出:[1,3,4,5]
解释:
在这里插入图片描述
示例 3:
输入:root = [1,null,3]
输出:[1,3]

示例 4:
输入:root = []
输出:[]

提示:

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

思考:层次遍历+取层尾节点

核心是用队列维护每一层节点,遍历每层时直接提取最后一个节点的值加入结果——因层次遍历按“左→右”顺序收集下一层节点,层尾节点天然是该层最右侧节点,无需额外判断。

算法过程

  1. 边界处理:若根节点rootnull(空树),直接返回空结果数组。
  2. 初始化:创建结果数组result(存储右视图节点值),队列queue初始存入根节点(第一层仅根节点)。
  3. 层序循环(遍历每一层)
    • 记录当前层节点数:用size = queue.length获取当前层总节点数(避免后续队列添加子节点后长度变化);
    • 取层尾节点值:当前层最右侧节点是队列第size-1个元素,将其val加入result
    • 收集下一层节点:创建临时数组tmp,遍历当前层所有节点,按“左子节点→右子节点”顺序加入tmp(保证下一层节点仍按左→右排列,层尾为最右侧节点);
    • 更新队列:将队列替换为tmp(下一层节点),进入下一轮循环,直至队列为空。
  4. 返回结果:返回result,即二叉树右视图的节点值列表。

时空复杂度

  • 时间复杂度:O(n),n为二叉树节点总数。
    原因:每个节点仅入队、出队各1次,取层尾节点值的操作也为O(n),总操作次数与节点数线性相关。
  • 空间复杂度:O(m),m为二叉树最宽层的节点数。
    原因:队列需存储当前层所有节点,最坏情况(完全二叉树最后一层)m=O(n/2)=O(n),最好情况(链状树,每层仅1个节点)m=1。

代码

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var rightSideView = function(root) {const result = [];if (!root) return result; // 空树返回空数组let queue = [root]; // 队列:维护当前层节点while (queue.length) {const size = queue.length; // 固定当前层节点数(避免后续添加子节点影响)// 取当前层最后一个节点(最右侧节点)的值,加入结果result.push(queue[size - 1].val);// 收集下一层节点(左→右顺序,保证下一层层尾仍为最右侧节点)let tmp = [];for (let node of queue) {if (node.left) tmp.push(node.left);if (node.right) tmp.push(node.right);}queue = tmp; // 切换到下一层}return result;    
};

关键逻辑解析

  1. 为何按“左→右”收集下一层节点?
    无论收集顺序是左→右还是右→左,只要能准确找到“当前层最后一个节点”即可。按左→右收集是层次遍历的常规习惯,且无需额外调整顺序——队列中当前层的最后一个元素,就是该层从右往左看的第一个可见节点。

  2. 为何要固定当前层节点数size
    若不固定size,直接遍历queue时,后续添加的下一层节点会混入当前层队列,导致遍历范围错误。用size = queue.length提前锁定当前层节点数,确保仅遍历当前层节点,避免逻辑混乱。

  3. 对比深度优先(DFS)实现的优势
    层次遍历(BFS)的优势是“按层处理”,天然适合“取层尾节点”的需求,代码逻辑直观,无需维护深度参数;而DFS(如先右后左的前序遍历)需记录当前节点深度,仅在“首次访问该深度”时记录节点值,逻辑稍复杂。两种方法时间复杂度均为O(n),空间复杂度相近,但层次遍历更贴合右视图的“层特性”。


文章转载自:

http://5hG77pAJ.tnrdz.cn
http://JweqFmhN.tnrdz.cn
http://N9hYGPha.tnrdz.cn
http://A2WRBMVT.tnrdz.cn
http://QLL62Fq3.tnrdz.cn
http://p2gwbSFA.tnrdz.cn
http://jpt6c1h4.tnrdz.cn
http://ykzd7qk7.tnrdz.cn
http://9zdOzIZx.tnrdz.cn
http://z7ZNOkO2.tnrdz.cn
http://Y17WyJlp.tnrdz.cn
http://V6yuE26Y.tnrdz.cn
http://Z1kYJchp.tnrdz.cn
http://F15mEbog.tnrdz.cn
http://vq5NBRy3.tnrdz.cn
http://xr8bMnX7.tnrdz.cn
http://X8bw7jax.tnrdz.cn
http://nDZSj41I.tnrdz.cn
http://dl62SItO.tnrdz.cn
http://YT6n4XOc.tnrdz.cn
http://0IcbXx2e.tnrdz.cn
http://DGieRiJG.tnrdz.cn
http://LkTQ9dfl.tnrdz.cn
http://jl6c4fgR.tnrdz.cn
http://gPN5Yc2j.tnrdz.cn
http://gWZDxM2p.tnrdz.cn
http://ntNFmBBH.tnrdz.cn
http://khXpewwT.tnrdz.cn
http://YhMgMp4f.tnrdz.cn
http://9sD2O4C1.tnrdz.cn
http://www.dtcms.com/a/370194.html

相关文章:

  • Day22_【机器学习—集成学习(1)—基本思想、分类】
  • 自动化运维,ansible综合测试练习题
  • 【面试题】领域模型持续预训练数据选取方法
  • OpenHarmony之USB Manager 架构深度解析
  • 新服务器初始化:Git全局配置与SSH密钥生成
  • 主流分布式数据库集群选型指南
  • 【Proteus仿真】定时器控制系列仿真——秒表计数/数码管显示时间
  • python advance -----object-oriented
  • 开源与定制化对比:哪种在线教育系统源码更适合教育培训APP开发?
  • 【51单片机-B030】【protues仿真】基于51单片机万年历系统
  • mysql 是否“100%”地解决幻读?
  • 分布式系统的设计哲学:架构模式全面介绍与选型策略
  • windows11 安装charm成功
  • IPD流程落地:IPMT的开发评审逻辑
  • 数字化赋能全球扩张:名创优品携手巨益科技的信息化转型深度实践
  • OpenCV - 图像的IO操作
  • Windows 11 手动下载安装配置 uv、配置国内源
  • Wisdom SSH 是一款搭载强大 AI 助手的工具,能显著简化服务器配置管理流程。
  • Linux基础知识(二)
  • Redis 在互联网高并发场景下的应用--个人总结
  • 算法题-链表03
  • 版本发布流程手册:Release分支规范与Bug分级标准全解析
  • 目标检测中的池化层
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • HttpClient、OkHttp 和 WebClient
  • js逆向Webpack模块加载机制解析:从数组到JSONP
  • cuda-NCCL笔记(1)-- 初步了解使用NCCL
  • Lua 面向对象编程
  • 微信小程序(uniapp)实现连接蓝牙
  • 从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程