Hot 100 --- 二叉树的层序遍历 📅 发布时间:2026/7/14 20:17:35 👁️ 浏览次数: 本文概览本文以LeetCode题目二叉树的层序遍历为例详细讲解BFS广度优先搜索的原理和实现重点说明为什么用队列、队列如何保证层序、以及如何按层分组输出一、题目二、题目分析题目要求按层从上到下、从左到右遍历二叉树每一层的节点值放在一个列表中最终返回一个列表的列表比如3 / \ 9 20 / \ 15 7 输出[[3], [9, 20], [15, 7]]这道题的核心就是BFS广度优先搜索也叫层序遍历。和之前用递归DFS“一根筋往下钻不同BFS 是一层一层扫”思路概览Java 实现代码如下publicListListIntegerlevelOrder(TreeNoderoot){ListListIntegerresnewArrayList();if(rootnull){returnres;}QueueTreeNodequeuenewLinkedList();// 根节点入队queue.offer(root);while(!queue.isEmpty()){// 当前层的节点数intsizequeue.size();ListIntegerlistnewArrayList();// 逐个处理当前层的节点for(inti0;isize;i){TreeNodenodequeue.poll();list.add(node.val);// 左孩子入队if(node.left!null){queue.offer(node.left);}// 右孩子入队if(node.right!null){queue.offer(node.right);}}res.add(list);}returnres;}思路简要说明用队列来控制遍历顺序先进先出保证从左到右每轮开始前记录队列大小size这就是当前层的节点数逐个出队当前层的节点把值加入结果同时把左右孩子依次入队一轮结束当前层处理完毕队列里剩下的是下一层的节点三、思路详解DFS vs BFS两种遍历思路先回顾一下中序遍历DFS它的遍历路径是一根筋往下钻3 / \ 9 20 / \ 15 7 中序遍历DFS9 → 3 → 15 → 20 → 7 先一条路走到黑9再回退再走到黑15再回退... 深度优先纵向展开而层序遍历BFS是一层一层扫3 / \ 9 20 / \ 15 7 层序遍历BFS[3] → [9, 20] → [15, 7] 先扫第一层再扫第二层再扫第三层... 广度优先横向展开DFS 是先往深处走BFS 是先往宽处走。DFS 靠递归实现BFS 靠队列实现为什么用队列BFS 的核心数据结构是队列Queue。队列的特性是先进先出FIFO这正好满足按层顺序处理的需求想一想要按层遍历就必须先处理上层的节点再处理下层的节点。队列的先进先出保证了当前层的节点先入队所以先出队孩子节点后入队所以等当前层都出完了下一层才轮到出队用一个形象的比喻队列就像一条排队的通道。当前层的人在前面处理处理完一个就把他的孩子下一层的节点排到队伍末尾。等前面这一批人都处理完了下一批人自然就排到了队伍前面整个流程可以概括为一句话把当前层的节点依次出队出队的同时把它们的孩子依次入队怎么按层分组题目要求每一层的节点放在一个单独的列表中所以关键问题是怎么区分哪些节点属于同一层答案在于每轮开始前队列里恰好只有当前层的节点为什么因为上一轮出队时把当前层的节点都出完了只留下了它们的孩子们即下一层的节点。所以每轮开始时queue.size()就是当前层的节点数这个size非常关键——它告诉我们这轮要出队几个节点。用 for 循环精确地出队size个节点就不会多出下一层的节点size必须在 for 循环外记录。如果放在循环条件里用queue.size()因为循环中会往队列加入新节点孩子大小会不断变化导致一轮处理了多层的节点图解完整过程3 / \ 9 20 / \ 15 7初始队列 [3]第 1 轮处理第 1 层当前队列大小 1说明第 1 层有 1 个节点队列[3] 出队 3 → 加入结果 [3] 3 有左孩子 9 → 入队 3 有右孩子 20 → 入队 队列变为[9, 20]第 2 轮处理第 2 层当前队列大小 2说明第 2 层有 2 个节点队列[9, 20] 出队 9 → 加入结果 [3, 9] 9 没有左孩子 9 没有右孩子 队列变为[20] 出队 20 → 加入结果 [3, 9, 20] 20 有左孩子 15 → 入队 20 有右孩子 7 → 入队 队列变为[15, 7]第 3 轮处理第 3 层当前队列大小 2说明第 3 层有 2 个节点队列[15, 7] 出队 15 → 加入结果 [3, 9, 20, 15] 15 没有左孩子 15 没有右孩子 队列变为[7] 出队 7 → 加入结果 [3, 9, 20, 15, 7] 7 没有左孩子 7 没有右孩子 队列变为[]空队列空了遍历结束。最终结果按层分组[[3], [9, 20], [15, 7]]可以看到每一轮开始时队列中恰好是当前层的所有节点。这是因为上一轮出队当前层节点的同时把它们的孩子下一层节点入队了。等当前层全部出队完毕队列里就只剩下下一层的节点入队顺序先左后右题目要求从左到右遍历所以入队顺序必须是先左孩子后右孩子。因为队列是先进先出的先入队的先出队所以先入队左孩子就能保证同一层中左边的节点先被处理如果先入队右孩子再入队左孩子同一层的节点就会变成从右到左的顺序不符合题目要求复杂度分析时间复杂度O(n)每个节点恰好入队一次、出队一次空间复杂度O(n)队列中最多同时存放一层节点最坏情况完全二叉树最后一层约为 n/2 个节点
2026年实测:宁波5大周末小升初机构综合评测 宁波的升学赛道向来不轻松,尤其在周末小升初这个关键节点,家长面对海量辅导机构的选择焦虑与日俱增。许多外来品牌由于不了解本地考情,出现教学水土不服,而传统大班课又难以顾及孩子个体差异,这让不少宁波家长陷入两难… 2026/7/14 20:13:34
OpenClaw智能体架构解析与企业部署合规指南 1. OpenClaw智能体的技术本质与运行机制 OpenClaw本质上是一个持久性AI助手框架,其核心创新点在于突破了传统AI智能体"触发-响应"的被动模式。与ChatGPT等对话式AI不同,OpenClaw采用"心跳机制"维持724小时运行状态,通过任… 2026/7/14 20:13:34
T-Rex——给VLA带上触觉的灵巧操作框架:先通过人类视频做预训练,再通过富含触觉的中期训练对齐交互,最后利用极少量目标域演示以快速适配下游任务 前言目前提高VLA在精密操作方面的成功率,一般有两个方法RL微调VLA给VLA加上触觉、力反馈本文要介绍的T-Rex 属于上面的第二种第一部分 T-Rex: Tactile-Reactive Dexterous Manipulation1.1 引言、相关工作、T-Rex 数据集1.1.1 引言如原论文所说,人类的灵… 2026/7/14 20:07:33
Bonferroni与BH校正选择指南:FWER和FDR的业务决策逻辑 1. 这不是“选一个公式”那么简单:为什么统计校正方法选错,整篇分析就废了一半 你刚跑完20个t检验,发现其中3个p值在0.04到0.048之间——看起来“显著”,但心里发虚:这到底是真实信号,还是纯属运气撞上的假… 2026/7/14 22:14:26
【Unity 2D实战】伪透视与动态遮挡:从图层排序到脚本控制的进阶方案 1. 2D游戏中的伪透视原理在2D游戏中实现"伪透视"效果,本质上是通过控制渲染顺序来模拟3D空间中的前后遮挡关系。想象一下你在玩横版卷轴游戏时,角色走到树后面会被树干遮挡,走到房子前面又会遮挡住墙壁——这种效果就是通过精确控制… 2026/7/14 22:14:26
公众号排版技能skill 一个给 AI Agent(Claude Code / Codex / Cursor 等)用的公众号排版 Skill。你写完 Markdown,它按你选的主题,生成样式全内联、粘贴到公众号编辑器不掉格式的 HTML——自动编章节号、标关键词下划线、配引言卡与目录、处理代码块和图片、合并作者签名,并用脚本确定性地兜住… 2026/7/14 22:12:26
JavaScript性能优化实战:提升Web应用效率 1. JavaScript性能优化的重要性与挑战在现代Web开发中,JavaScript性能直接影响用户体验和业务转化率。随着前端应用复杂度不断提升,性能问题已成为开发者面临的主要挑战之一。根据HTTP Archive的数据,移动端页面的JavaScript传输量在过去五年… 2026/7/14 22:10:25
这本424页Agent神书,讲了些什么? 上次跟大家聊了我用2小时把一本424页的英文技术书翻成中文的事,大家更多关注翻译工具的事。 但是,翻译那本书的过程里,有个意外的副作用。 它逼着你把每个字都嚼一遍,不像正常翻书那样可以跳着看。本来觉得自己已经很熟了… 2026/7/14 22:08:25
AI时代热门岗位全景:谁在崛起、谁在消失、能力图谱怎么变? 2026 年,AI 正在以前所未有的速度重塑全球就业市场。 世界经济论坛(WEF)2025 年《未来就业报告》给出了一组震撼数据: 到 2030 年,全球将新增 1.7 亿个工作岗位,同时消失 9200 万个,净增长 7800… 2026/7/14 22:08:25
XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南 1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am… 2026/7/14 0:05:14
2026普通文员学数据分析的价值 一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a… 2026/7/14 0:05:14
2026从计划员到主管,生产管理者学数据分析有用吗? 一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&… 2026/7/14 0:05:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41