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

LeetCode 102:二叉树的层序遍历 | BFS

LeetCode 102:二叉树的层序遍历 | BFS

一、题目详解

1.1 题目描述

LeetCode 102:二叉树的层序遍历(Binary Tree Level Order Traversal)

给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。

难度:Medium

示例 1:

输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1] 输出:[[1]]

示例 3:

输入:root = [] 输出:[]

1.2 题目分析

层序遍历也称为广度优先搜索(BFS),与前序、中序、后序遍历(深度优先搜索)不同,层序遍历按层次从上到下、从左到右访问节点。


二、算法实现

2.1 BFS实现(使用队列)

from collections import deque def levelOrder(root): if not root: return [] result = [] queue = deque([root]) while queue: level = [] size = len(queue) for _ in range(size): node = queue.popleft() level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level) return result

BFS思路解析:

  1. 初始化队列,将根节点入队
  2. 记录当前队列大小(即当前层的节点数)
  3. 遍历当前层的所有节点:
    • 出队节点并访问
    • 将子节点入队
  4. 将当前层结果加入最终结果
  5. 重复直到队列为空

2.2 递归实现

def levelOrder_recursive(root): result = [] def bfs(node, level): if not node: return # 如果当前层还没有对应的列表,创建一个 if len(result) == level: result.append([]) # 将当前节点值加入对应层 result[level].append(node.val) # 递归处理子节点,层数+1 bfs(node.left, level + 1) bfs(node.right, level + 1) bfs(root, 0) return result

递归思路解析:

  1. 使用递归深度优先搜索
  2. 通过参数记录当前节点所在的层数
  3. 根据层数将节点值放入对应的列表中

2.3 按层输出(自底向上)

def levelOrderBottom(root): if not root: return [] result = [] queue = deque([root]) while queue: level = [] size = len(queue) for _ in range(size): node = queue.popleft() level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.insert(0, level) # 插入到列表开头 return result

三、复杂度分析

3.1 BFS实现

  • 时间复杂度:O(n),每个节点入队出队一次
  • 空间复杂度:O(n),最坏情况(完全二叉树最后一层)需要存储 n/2 个节点

3.2 递归实现

  • 时间复杂度:O(n),每个节点访问一次
  • 空间复杂度:O(h),递归调用栈的深度

四、边界情况讨论

4.1 空树

root = None # 输出:[]

4.2 单节点树

root = TreeNode(1) # 输出:[[1]]

4.3 完全二叉树

# 1 # / \ # 2 3 # / \ / \ # 4 5 6 7 # 输出:[[1], [2, 3], [4, 5, 6, 7]]

4.4 只有左子树

# 1 # / # 2 # / # 3 # 输出:[[1], [2], [3]]

五、应用场景

5.1 求树的最大深度

def maxDepth(root): if not root: return 0 depth = 0 queue = deque([root]) while queue: depth += 1 size = len(queue) for _ in range(size): node = queue.popleft() if node.left: queue.append(node.left) if node.right: queue.append(node.right) return depth

5.2 求树的最小深度

def minDepth(root): if not root: return 0 depth = 0 queue = deque([root]) while queue: depth += 1 size = len(queue) for _ in range(size): node = queue.popleft() # 找到叶子节点,返回当前深度 if not node.left and not node.right: return depth if node.left: queue.append(node.left) if node.right: queue.append(node.right) return depth

5.3 层序遍历的变种

# 锯齿形层序遍历(之字形) def zigzagLevelOrder(root): if not root: return [] result = [] queue = deque([root]) left_to_right = True while queue: level = [] size = len(queue) for _ in range(size): node = queue.popleft() if left_to_right: level.append(node.val) else: level.insert(0, node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level) left_to_right = not left_to_right return result

六、总结

6.1 核心要点

要点说明
遍历方式广度优先搜索(BFS)
数据结构使用队列(Queue)
关键技巧记录每层的节点数量
时间复杂度O(n)

6.2 BFS与DFS对比

特性BFS(层序)DFS(前/中/后序)
遍历顺序按层访问深度优先
数据结构队列栈(递归调用栈)
空间复杂度O(n)O(h)
适用场景最短路径、层序处理树的遍历、分治

6.3 扩展思考

  1. 如何实现层序遍历的迭代版本?
  2. 层序遍历和DFS遍历在内存使用上有什么区别?
  3. 在什么情况下BFS比DFS更合适?

参考资料:

  • LeetCode 102 题解
  • 广度优先搜索
http://www.rkmt.cn/news/1408839.html

相关文章:

  • 从虚短虚断到信号运算:同相/反相放大器与四则运算电路的实战推导
  • 如何永久保存微信聊天记录?3个步骤让你的数字记忆永不丢失
  • 2026最新 | 零Prompt自动生成电商带货视频,这个AI工作台把出片门槛打成了地板
  • 4款主流降AI工具知网维普实测对比:2026年5月降AI率排行榜
  • 数字化消防安全教育展厅设备【火灾案例查询系统】
  • 打通 Physical AI 全链路!PhysX-Omni 补齐物理 AI基建:统一框架,通用数据与标准评测一步到位
  • Linux下Webbench压力测试实战:从安装到结果深度解析
  • 3分钟学会:用OCRmyPDF让扫描文档秒变可搜索PDF的终极指南
  • 智能制造的关键入口:从传统视觉到AI智能体视觉(4)
  • Cortex-R4处理器nCPUHALT信号原理与应用解析
  • CCS链接警告剖析:SECTIONS缺失导致输出段‘XXXXXXX’未定义的修复策略
  • 【Redis实战篇】缓存-穿透/雪崩/击穿问题的解决方案
  • 工业物联网边缘设备自动化部署:基于uOS与代理的零接触配置方案
  • Linux文件寻踪:从locate到find的实战搜索指南
  • 聚焦2026年Q2:安徽老旧小区改造如何选择专业监理服务团队 - 2026年企业资讯
  • Notepad++ 详细下载安装全流程指南
  • AI 基础概念卡片
  • Cadence Virtuoso IC617:从零开始的工程创建与库管理实战
  • 梯度群体优化算法:融合粒子群与梯度下降的高维优化新范式
  • ChatGPT摄影构图实战指南(手机党必藏!2024最新Prompt工程+构图热力图校准技术)
  • 为什么访问 ASOS 需要住宅代理?原因与解决方案解析
  • 蓝牙协议栈探秘:从HCI到AMP的协同架构
  • 【Qt】QModbusRtuSerialMaster:串行Modbus客户端实战与帧时序调优
  • LoongSon——PMON实战命令手册:从启动到调试
  • 实战指南:在Kali Linux 2024.1中部署OWASP WebGoat 8.3.0
  • LightGlue:突破性自适应特征匹配技术实现10倍速度提升
  • 如何在现代浏览器中实现无插件的FLV播放?flv.js完整实战指南
  • 知识图谱驱动的研究工具:从信息孤岛到智能工作流
  • 保姆级教程:从零在LEVIR-CD数据集上复现DDPM-CD变化检测模型(PyTorch版)
  • 倾向得分加权Cox模型:ATT/ATO权重下方差估计的陷阱与校正