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

LeetCode 104:二叉树的最大深度 | DFS

LeetCode 104二叉树的最大深度 | DFS一、题目详解1.1 题目描述LeetCode 104二叉树的最大深度Maximum Depth of Binary Tree给定一个二叉树root返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。难度Easy示例 1输入root [3,9,20,null,null,15,7] 输出3示例 2输入root [1,null,2] 输出21.2 题目分析这是一道经典的树遍历问题可以使用深度优先搜索DFS或广度优先搜索BFS来解决。叶子节点没有子节点的节点左右子节点都为空。二、算法实现2.1 DFS递归实现def maxDepth(root): if not root: return 0 # 递归计算左右子树深度取较大值加1当前节点 left_depth maxDepth(root.left) right_depth maxDepth(root.right) return 1 max(left_depth, right_depth)递归思路解析如果当前节点为空深度为0递归计算左子树深度递归计算右子树深度当前节点的深度 1 max(左子树深度, 右子树深度)2.2 BFS实现from collections import deque def maxDepth_bfs(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 depthBFS思路解析初始化队列将根节点入队每处理完一层节点深度加1将当前层所有节点的子节点入队重复直到队列为空2.3 迭代DFS实现使用栈def maxDepth_iterative(root): if not root: return 0 max_depth 0 stack [(root, 1)] while stack: node, depth stack.pop() max_depth max(max_depth, depth) if node.right: stack.append((node.right, depth 1)) if node.left: stack.append((node.left, depth 1)) return max_depth三、复杂度分析3.1 递归DFS时间复杂度O(n)每个节点访问一次空间复杂度O(h)递归调用栈的深度最好情况平衡树O(log n)最坏情况链式树O(n)3.2 BFS时间复杂度O(n)每个节点入队出队一次空间复杂度O(n)队列最多存储 n/2 个节点3.3 迭代DFS时间复杂度O(n)每个节点入栈出栈一次空间复杂度O(h)栈的最大深度四、边界情况讨论4.1 空树root None # 输出04.2 单节点树root TreeNode(1) # 输出14.3 完全二叉树# 1 # / \ # 2 3 # / \ / \ # 4 5 6 7 # 最大深度34.4 链式树只有左子树# 1 # / # 2 # / # 3 # 最大深度3五、相关扩展问题5.1 最小深度def minDepth(root): if not root: return 0 # 如果只有左子树 if not root.right: return 1 minDepth(root.left) # 如果只有右子树 if not root.left: return 1 minDepth(root.right) return 1 min(minDepth(root.left), minDepth(root.right))5.2 判断平衡二叉树def isBalanced(root): def check(node): if not node: return 0 left check(node.left) if left -1: return -1 right check(node.right) if right -1: return -1 if abs(left - right) 1: return -1 return 1 max(left, right) return check(root) ! -15.3 二叉树的直径def diameterOfBinaryTree(root): max_diameter 0 def depth(node): nonlocal max_diameter if not node: return 0 left depth(node.left) right depth(node.right) # 更新直径 max_diameter max(max_diameter, left right) return 1 max(left, right) depth(root) return max_diameter六、总结6.1 核心要点要点说明递归DFS代码简洁易于理解BFS使用队列按层计数迭代DFS使用栈模拟递归时间复杂度三种方法都是O(n)6.2 方法对比方法优点缺点递归DFS代码最简洁可能栈溢出极端情况BFS层次清晰空间复杂度较高迭代DFS避免栈溢出代码稍复杂6.3 扩展思考如何计算二叉树的平均深度如何找到二叉树中距离最远的两个节点最大深度问题在实际应用中有什么意义参考资料LeetCode 104 题解二叉树深度
http://www.gsyq.cn/news/1409230.html

相关文章:

  • LeetCode 94:二叉树的中序遍历 | 递归与迭代
  • 牙科器械包装顶头袋批发的实操应用
  • 品牌推广怎么少走弯路:这 10 个误区别踩
  • 5分钟掌握开源小说写作神器:novelWriter完全指南
  • 别再乱发优惠券了!用Python的CausalML库,手把手教你搭建Uplift Model精准识别高价值用户
  • 超越准确度:混淆矩阵如何揭示模型评估的真相
  • 车道居中控制(LCC)全解析:从技术原理到产业未来
  • 告别Excel.dll!在Unity 2018+中快速集成ExcelDataReader读取.xlsx表格(保姆级教程)
  • 彻底搞懂:半导体、内存、硬盘、CPU存储的底层关系
  • 通过curl命令快速诊断taotoken api连接与认证问题的排查方法
  • 客流统计系统如何做长期数据沉淀?聊聊去重、Session 化与数据一致性问题
  • 别再傻傻分不清!用Arduino和ESP32驱动电机,NPN三极管与N-MOS管实战选型指南
  • 从扭矩控制到总线拓扑:多自由度高动态机器人实机调试的底层逻辑与工程痛点
  • 避开这3个坑!用Tushare获取股票数据时新手常犯的错误(附正确代码示例)
  • 别再让CPU干苦力了!手把手教你用STM32G4的FMAC硬件加速器做FIR滤波
  • HC-276合金厂商那家好?资深采购员实地测评 - 品牌2025
  • AI代码审查:让AI帮你把关代码质量
  • 文章没人看?多半是标题的锅:我用 Codex + Obsidian 做了个爆款标题 Skil
  • 2026年至今福建好的餐边柜制造商:如何精准选型避坑? - 2026年企业资讯
  • 化工领域热门推荐:Incoloy 800在高温高压下的表现如何? - 品牌2025
  • S32K3 eMIOS实战:从MCAL配置到PWM与ICU的精准控制
  • 2026年高端制造新标杆:探秘深圳市聚德鑫特殊钢材的Inconel 718品质之道 - 品牌2025
  • 2026年 电磁离合器/电磁制动器/电磁刹车器推荐榜单:单片、多片与通电失电式全系优选解析 - 品牌企业推荐师(官方)
  • C251嵌入式开发中的精准延时实现与优化
  • 2026年 3051DP差压变送器厂家推荐榜:TK-DZS-3051DP/天康智能变送器品牌与高精度优选 - 品牌企业推荐师(官方)
  • AR 智能眼镜智正优化警务领域的日常巡逻和排查麻烦的难点
  • 用Python实战MUSIC算法:手把手教你实现麦克风阵列的声源定位(附代码)
  • Ali-tianchi news:all
  • 基于 okbiye 的 AI 期刊论文写作实践:从普通刊到 SCI 的全场景辅助路径
  • 拯救老系统:手把手教你在macOS Ventura/Sonoma上配置金蝶EAS 8.2客户端