news 2026/7/7 11:56:42

【码道初阶】【LeetCode 102】二叉树层序遍历:如何利用队列实现“一层一层切蛋糕”?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【码道初阶】【LeetCode 102】二叉树层序遍历:如何利用队列实现“一层一层切蛋糕”?

这是一篇为您定制的技术博客,详细解读了您使用的**广度优先搜索(BFS)**策略。您的代码是非常标准的层序遍历模板,逻辑清晰,特别是利用size变量来控制每一层的遍历,是解题的关键。

以下是为您生成的博客文章:


【LeetCode 102】二叉树层序遍历:如何利用队列实现“一层一层切蛋糕”?

在二叉树的遍历中,前序、中序、后序遍历通常使用递归(DFS,深度优先搜索)来实现,它们是一头扎到底再回头。

但在很多面试题中,我们需要按照“从上到下、从左到右”的顺序输出节点,这就好比切蛋糕一样,一层一层地处理。这种遍历方式被称为层序遍历(Level Order Traversal)

解决这个问题的神器不是递归,而是队列(Queue)。今天我们就结合一段标准的 Java 代码,深入剖析**广度优先搜索(BFS)**在二叉树中的应用。

1. 核心思想:广度优先搜索 (BFS)

层序遍历的本质就是 BFS。我们需要一个“候车室”(队列)来暂存当前层的节点。

  • 先把第一层的节点(根节点)放入候车室。
  • 处理候车室里的节点时,顺便把它的孩子(下一层)按顺序放入候车室排队。
  • **先进先出(FIFO)**的特性保证了我们总是先处理完当前层,才会轮到下一层。

2. 代码深度拆解

代码采用了最经典的 BFS 迭代写法,我们可以将其分为三个阶段:

代码总览:

/** * 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; * } * } */classSolution{publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>res=newArrayList<>();if(root==null)returnres;Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){intsize=queue.size();List<Integer>list=newArrayList<>();while(size!=0){TreeNodecur=queue.poll();list.add(cur.val);if(cur.left!=null)queue.offer(cur.left);if(cur.right!=null)queue.offer(cur.right);size--;}res.add(list);}returnres;}}

第一阶段:初始化与判空

publicList<List<Integer>>levelOrder(TreeNoderoot){List<List<Integer>>res=newArrayList<>();// 1. 边界处理:如果是空树,直接返回空列表if(root==null)returnres;// 2. 准备“候车室”:使用 LinkedList 实现 Queue 接口Queue<TreeNode>queue=newLinkedList<>();// 3. 将根节点入队,作为第一层queue.offer(root);

这里有一个细节:使用LinkedList来实例化Queue是 Java 中的标准做法,因为LinkedList实现了双端队列接口,入队(offer)和出队(poll)操作非常高效。

第二阶段:外层循环(遍历所有层)

// 只要队列不空,说明还有层级没处理完while(!queue.isEmpty()){// 【关键点】记录当前队列的大小intsize=queue.size();List<Integer>list=newArrayList<>();

这是全段代码最精华的地方!
为什么要专门用一个变量size记录queue.size()

  • 在进入内层循环前,队列里存放的仅仅是当前这一层的所有节点
  • 我们需要知道当前层有几个节点,这样在接下来的处理中,我们才能准确地只弹出这几个节点,而不小心处理到了新加入的下一层节点。

第三阶段:内层循环(批处理当前层)

// 处理当前层的每一个节点while(size!=0){// 1. 出队:拿出当前层的节点TreeNodecur=queue.poll();// 2. 记录值list.add(cur.val);// 3. 入队:如果有孩子,把它们加入队列尾部(成为下一层)if(cur.left!=null)queue.offer(cur.left);if(cur.right!=null)queue.offer(cur.right);// 当前层待处理节点数 -1size--;}// 当前层处理完毕,将结果加入总列表res.add(list);}returnres;}

在这个循环中,队列发生了一个微妙的变化:旧的一层正在离开,新的一层正在进入。
因为我们严格控制了循环次数为size(旧层的节点数),所以即使新节点加入到了队列尾部,也不会在这一轮循环中被处理。这就完美实现了“分层”。

3. 图解执行流程

假设输入:[3, 9, 20, null, null, 15, 7]

  1. 初始状态

    • Queue:[3]
    • res:[]
  2. 第一轮外循环

    • size = 1
    • 内循环:弹出3,加入9,20。Queue:[9, 20]
    • 内循环结束,list[3]
    • res:[[3]]
  3. 第二轮外循环

    • size = 2(此时队列里有 9 和 20)。
    • 内循环第1次:弹出9,无孩子。Queue:[20]
    • 内循环第2次:弹出20,加入15,7。Queue:[15, 7]
    • 内循环结束,list[9, 20]
    • res:[[3], [9, 20]]
  4. 第三轮外循环

    • size = 2(此时队列里有 15 和 7)。
    • 内循环:依次弹出157,无新孩子加入。Queue:[]
    • res:[[3], [9, 20], [15, 7]]
  5. 结束:队列为空,退出。

4. 复杂度分析

  • 时间复杂度O(N)O(N)O(N)
    每个节点进队一次,出队一次,我们遍历了整棵树的NNN个节点。
  • 空间复杂度O(N)O(N)O(N)
    • 队列中最多同时存储一层的节点。在最坏情况(完全二叉树的底层),大约包含N/2N/2N/2个节点。
    • 返回值列表也需要存储NNN个节点的值。

5. 总结

这段代码是 BFS 解决二叉树层序遍历的标准模板

解题的核心在于理解Queue(队列)的 FIFO 特性,以及利用size变量对队列中的元素进行“分批处理”。掌握了这个模板,你不仅能解决这道题,还能轻松解决诸如“二叉树的锯齿形层序遍历”、“二叉树的最大深度”、“二叉树的右视图”等一系列变种题目。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 13:15:20

Docker中运行多模态Agent测试用例,90%团队忽略的3个关键陷阱

第一章&#xff1a;Docker中多模态Agent测试的现状与挑战在当前人工智能系统快速发展的背景下&#xff0c;多模态Agent&#xff08;如结合视觉、语音与自然语言处理能力的智能体&#xff09;逐渐成为复杂应用场景的核心组件。这些Agent通常依赖于高度集成的运行环境&#xff0c…

作者头像 李华
网站建设 2026/7/7 12:27:07

CopilotKit实时协作:重新定义多人AI交互的技术交响曲

想象一下&#xff0c;你正在与团队成员协作编辑一份重要文档&#xff0c;每个人都在向AI助手提出不同的问题&#xff1a;有人需要翻译某个段落&#xff0c;有人在修改格式&#xff0c;还有人要求生成摘要。这时你发现——AI的回复开始混乱&#xff0c;状态同步延迟&#xff0c;…

作者头像 李华
网站建设 2026/7/7 8:05:40

ReoGrid实战指南:轻松搞定.NET电子表格开发难题

还在为.NET应用中的表格功能头疼吗&#xff1f;数据展示不够直观&#xff1f;公式计算太复杂&#xff1f;别担心&#xff0c;ReoGrid这款神器将彻底改变你的开发体验&#xff01;作为一款功能强大的开源电子表格组件&#xff0c;它让复杂的表格开发变得像搭积木一样简单有趣。 …

作者头像 李华
网站建设 2026/7/7 13:06:31

EDI 电子数据交换2026年展望:洞察2026年EDI 电子数据交换的新范式

电子数据交换&#xff08;EDI&#xff09;作为企业间&#xff08;B2B&#xff09;数据自动交换的基石&#xff0c;已在全球供应链中运行数十年。然而&#xff0c;在近两年&#xff0c;面对日益复杂的全球供应链挑战、技术的快速迭代以及对数据智能的更高要求&#xff0c;EDI正经…

作者头像 李华
网站建设 2026/7/7 16:24:26

RuoYi-Cloud-Plus企业级实时消息推送架构深度解析

RuoYi-Cloud-Plus企业级实时消息推送架构深度解析 【免费下载链接】RuoYi-Cloud-Plus 微服务管理系统 重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba、Dubbo3.0、Sa-Token、Mybatis-Plus、MQ、Warm-Flow工作流、ES、Docker 全方位升级 定期同步 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/7/7 4:45:15

WebGL数据可视化实战:构建交互式3D图表系统终极指南

WebGL数据可视化实战&#xff1a;构建交互式3D图表系统终极指南 【免费下载链接】gallery Digital exhibition project developed based on three.js. 项目地址: https://gitcode.com/gh_mirrors/gallery/gallery 在当今大数据时代&#xff0c;如何将海量数据以直观、生…

作者头像 李华