首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
DAY3:LeetCode 104. 二叉树的最大深度(另一个方法)
📅 2026/10/13 8:56:17
✍️ 爱科研究院
👁 阅读 3,247
文章目录LeetCode 104. 二叉树的最大深度 —— BFS / 队列解法前置知识队列常用操作1. 创建队列2. 从队尾加入元素3. 从队首取出元素4. 查看当前队列长度为什么队列可以解决最大深度整体流程第一轮第二轮第三轮为什么要先记录 level_size最终代码这道题最核心的思路DFS 和 BFS 的区别复杂度分析LeetCode 104. 二叉树的最大深度 —— BFS / 队列解法上一篇已经用 DFS 递归解决了这道题。二叉树基础、TreeNode、root的理解以及 DFS 递归思路可以看上一篇 上一个解决方法这一篇换一种方法BFS 队列。会好理解点。前置知识队列队列最重要的特点是先进先出FIFOFirst In First Out可以理解成排队先进入队列的元素 ↓ 先被取出来例如进入顺序1 - 2 - 3 取出顺序1 - 2 - 3Python 中需要使用这个不过leetcode不需要特意引入fromcollectionsimportdeque创建队列qdeque()常用操作1. 创建队列qdeque()如果一开始就要放入根节点qdeque([root])注意这里放进去的是根节点这个 TreeNode 对象并不是把整棵树转换成队列。 为什么是[root]而不是root其实和这种写法效果是一样的qdeque()q.append(root)最终队列中都会保存根节点root。区别在于deque()创建队列时可以传入一个可迭代对象让它根据这个对象初始化队列。但是root本身只是一个TreeNode对象并不是可迭代对象所以不能直接qdeque(root)因此需要用[root]把它包装成一个列表。不过需要注意这里的[root]不是把二叉树转换成列表。也不是复制一个新的节点。它只是创建了一个列表里面保存了root这个TreeNode对象的引用。然后deque()根据这个列表初始化队列。所以表示创建一个队列 ↓ 初始放入一个元素根节点 root后续从队列中取出的仍然是完整的TreeNode对象因此依然可以访问node.left node.right继续遍历它连接的子节点。2. 从队尾加入元素q.append(node)例如q.append(node.left)q.append(node.right)3. 从队首取出元素nodeq.popleft()popleft()会把最早进入队列的元素取出来。也就是最前面或者说最左边的那个。所以叫 popleft这正好符合先进先出4. 查看当前队列长度len(q)在这道题里这一步非常重要因为level_sizelen(q)可以记录当前这一层有多少个节点。为什么队列可以解决最大深度BFS 是广度优先搜索。和 DFS 一条路径一直往下走不同BFS 是一层一层遍历二叉树。例如3 / \ 9 20 / \ 15 7BFS 的遍历过程可以理解成第 1 层3 第 2 层9 20 第 3 层15 7所以这道题有一个很直接的思路遍历了多少层最大深度就是多少。整体流程先判断特殊情况ifrootisNone:return0如果根节点为空说明整棵树都不存在深度就是 0。也就是其中一个测试用例root[]然后qdeque([root])depth0此时队列中只有根节点。第一轮例如q [3]先记录level_sizelen(q)得到level_size 1说明当前这一层只有一个节点。然后for_inrange(level_size):只循环一次。取出nodeq.popleft()得到3然后把它的左右孩子加入队列q [9, 20]这一层处理完depth1所以depth 1第二轮此时q [9, 20]所以level_size2这一层有两个节点需要循环两次。第一次弹出 99 没有左右孩子所以不加入新的节点。此时q [20]第二次弹出 2020 有两个孩子15 7加入队尾q [15, 7]第二层处理完depth 2第三轮此时q [15, 7]两个节点都没有孩子。把它们弹出之后不再加入新的节点。最后q []这一层结束depth 3因为队列已经为空whileq:不再满足循环结束。最终最大深度 3为什么要先记录 level_size这一句level_sizelen(q)非常关键。因为在处理当前这一层时我们会不断把下一层的节点加入队列。例如当前 q [9, 20]处理20时又会加入15, 7如果不提前记录level_size2当前层和下一层就会混在一起。所以level_sizelen(q)相当于先把这一层需要处理几个节点固定下来。最终代码fromcollectionsimportdequeclassSolution:defmaxDepth(self,root:Optional[TreeNode])-int:ifrootisNone:return0qdeque([root])depth0whileq:level_sizelen(q)for_inrange(level_size):nodeq.popleft()# 左孩子ifnode.left:q.append(node.left)# 右孩子ifnode.right:q.append(node.right)depth1returndepth这道题最核心的思路可以简单记成队列中保存当前层的节点 ↓ 记录当前层节点数量 ↓ 依次弹出当前层节点 ↓ 把它们的左右孩子加入队尾 ↓ 当前层处理完成 ↓ depth 1 ↓ 继续下一层这里利用的就是队列先进先出的特点。DFS 和 BFS 的区别上一篇使用的是DFS 递归核心思路先不断往深处走 再把结果一层层返回这一篇使用的是BFS 队列核心思路一层一层遍历 每处理完一层 depth 1所以同一道题可以从两个不同方向理解DFS 当前深度 1 max(左子树深度, 右子树深度) BFS 遍历了多少层 最大深度复杂度分析设二叉树一共有n个节点。每个节点只会进入队列一次、弹出一次。所以时间复杂度O(n)队列中最多可能同时保存某一层的所有节点。所以空间复杂度O(n)最坏情况下某一层可能包含大量节点。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/13 8:56:17
纯前端动漫导航系统:HTML+CSS+JS实现可部署资源聚合站
2026/10/13 8:56:17
JMeter Throughput Controller 原理与正确用法解析
2026/10/13 8:51:16
从采药题彻底搞懂01背包:状态定义、空间优化与避坑指南
2026/10/13 10:22:01
元宝 LeetCode 332. Reconstruct Itinerary Java Implement
2026/10/13 10:22:01
Android Room数据库升级迁移实战:从原理到避坑指南
2026/10/13 10:22:01
C语言复习(内存、结构体)
2026/10/13 10:22:01
源码编译实战:从configure到定制安装的完整指南
2026/10/13 10:22:01
OpenMuse:轻量级Personal Agent框架的工程实践与扩展指南
2026/10/13 10:16:59
AIStore免费AI公开课-智能体篇(六):Hermes上架AI Store,自记忆智能体,开箱即用
2026/10/13 0:00:40
物联网系统集成避坑指南:从选型到验收的关键要点
2026/10/13 0:00:40
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查
2026/10/13 0:00:40
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析
2026/10/12 8:53:44
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/12 8:53:42
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/13 8:14:22
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/12 19:53:23
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/11 21:41:11
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/11 23:43:10
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)