当前位置: 首页 > 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.jsqmd.com/news/900050/

相关文章:

  • 如何永久保存微信聊天记录?3个步骤让你的数字记忆永不丢失
  • 保研文书进阶指南:如何打造一份脱颖而出的导师推荐信
  • macOS菜单栏架构演进:Ice如何重构系统级UI管理范式
  • 打通 Physical AI 全链路!PhysX-Omni 补齐物理 AI基建:统一框架,通用数据与标准评测一步到位
  • Linux下Webbench压力测试实战:从安装到结果深度解析
  • LLM应用安全实战:构建IPI-Scanner防御间接提示注入攻击
  • 3分钟学会:用OCRmyPDF让扫描文档秒变可搜索PDF的终极指南
  • 从Simulink模型到C代码:嵌入式实时系统开发实战
  • Kokkidio:融合Eigen与Kokkos,实现CPU/GPU高性能可移植计算
  • Hap QuickTime Codec:面向现代GPU的高性能视频编解码器深度解析
  • 掌握高效视频处理:智能硬字幕提取的完整指南
  • 贝叶斯网络中四种近似推理方法 CS188 Note15 学习笔记
  • 工业物联网边缘设备自动化部署:基于uOS与代理的零接触配置方案
  • 2026年近期河北省粮食自动装车机企业哪家好?专业测评与选购指南 - 2026年企业资讯
  • 思源宋体TTF字体完全指南:7种样式免费商用,轻松打造专业中文排版
  • Go语言GC源码:三色标记原理深度解析
  • 聚焦2026年Q2:安徽老旧小区改造如何选择专业监理服务团队 - 2026年企业资讯
  • 别再手动写Swagger注释了!用ChatGPT自动生成OpenAPI 3.1文档的6步精准工程法(含安全脱敏模块)
  • AI大模型可靠性突破:GPT-5.5幻觉率从52.5%降至26.3%,OpenAI基于深度学习与机器学习的强化学习+对抗验证技术路线全解析
  • RustSFQ:利用Rust所有权系统保障超导SFQ电路I/O一致性
  • Python核心语法分类详解:从入门到精通
  • 四大模块掌握GenomeScope:从k-mer分析到基因组特性快速解读
  • 2026年苹果舱厂家推荐榜:景区/露营/民宿/移动苹果舱品牌甄选,创意设计+精装品质深度解析 - 品牌企业推荐师(官方)
  • HICO-DET数据集实战:用Python解析anno_bbox.mat,快速提取人-物交互标注信息
  • 2026年 沈阳一站式注册公司榜单:小规模/一般纳税人/无地址注册与创业全流程解析 - 品牌企业推荐师(官方)
  • 告别命令行恐惧:用Xmanager 5在Windows上图形化操作CentOS服务器(保姆级配置)
  • 百考通AI:智能问卷设计,轻松输出专业内容
  • 2026年5月热门的南京洁净室翻新公司有哪些厂家推荐榜,净化板修复/无尘车间翻新/GMP车间维护/洁净室密封优化厂家选择指南 - 海棠依旧大
  • p-Bit非理想特性对组合优化与概率逻辑计算的影响与设计指南
  • LightGlue:突破性自适应特征匹配技术实现10倍速度提升