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

Leetcode刷题记录33——二叉树的最小深度

题源:https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/

题目描述:
在这里插入图片描述

思路一:
使用 DFS 递归遍历的解法,每当遍历到一条树枝的叶子节点,就会更新最小深度,当遍历完整棵树后,就能算出整棵树的最小深度。
代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def __init__(self):# 记录最小深度(根节点到最近的叶子节点的距离)self.minDepthValue = float('inf')# 记录当前遍历到的节点深度self.currentDepth = 0def minDepth(self, root):""":type root: Optional[TreeNode]:rtype: int"""if root is None:return 0# 从根节点开始遍历self.traverse(root)return self.minDepthValuedef traverse(self, root):    if root is None:return None# 在二叉树的前序位置进入节点时增加当前深度self.currentDepth += 1# 如果当前节点是叶子节点,更新最小深度if root.left is None and root.right is None:self.minDepthValue = min(self.minDepthValue, self.currentDepth)self.traverse(root.left)self.traverse(root.right)# 在二叉树的后序位置离开节点时减少当前深度self.currentDepth -= 1

执行时间如下,可以看出,DFS算法速度较慢,因为该算法必须确切的知道每条树枝的深度(根节点到叶子节点的距离),才能找到最小的那个:
在这里插入图片描述

思路二:
使用 BFS 层序遍历的解法。按照 BFS 从上到下逐层遍历二叉树的特点,当遍历到第一个叶子节点时,就能得到最小深度。
代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def minDepth(self, root):""":type root: Optional[TreeNode]:rtype: int"""if root is None:return 0q = deque([root])# root 本身就是一层, depth 初始化为1depth = 1while q:sz = len(q)# 遍历当前层的节点for _ in range(sz):cur = q.popleft()# 判断是否到达叶子节点if cur.left is None and cur.right is None:return depth# 将下一层节点加入队列if cur.left is not None:q.append(cur.left)if cur.right is not None:q.append(cur.right)# 增加深度depth += 1return depth

执行时间如下,由于 BFS 逐层遍历的逻辑,第一次遇到目标节点时,所经过的路径就是最短路径,算法可能并不需要遍历完所有节点就能提前结束:
在这里插入图片描述

相关文章:

  • 谈判模拟器提示词设计 - Gemini 2.5 优化版
  • Agent2Agent(谷歌A2A)协议原理讲解
  • CatBoost算法原理及Python实现
  • 牛客 Wall Builder II 题解
  • DeepSeek-提示词工程
  • 形式化数学——Lean的介绍与安装
  • Python异步编程入门:从同步到异步的思维转变
  • 链表操作练习
  • 【C++】WSL常用语法
  • 电子商务商家后台运营专员模板
  • Android工厂模式
  • 设一个测试情境,新用户注册后显示的名字不完整,测试思路是怎么样的?
  • 【C/C++】inline关键词
  • 用网页显示工控仪表
  • 精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略
  • 常见小模型的实现原理及使用示例:Android端
  • 黑马点评day02(缓存)
  • 常用CPU、GPU、NPU、DSP、ASIC等芯片区别介绍
  • IL2CPP 技术深度解析
  • 三星SMT贴片机选型与效能提升指南
  • 我驻旧金山总领事馆:黄石公园车祸中受伤同胞伤情稳定
  • 新加坡执政党人民行动党在2025年大选中获胜
  • 包揽金银!王宗源、郑九源夺得跳水世界杯总决赛男子3米板冠亚军
  • 安徽安庆市委书记张祥安调研假日经济和旅游安全工作
  • 人民日报头版头条:青春为中国式现代化挺膺担当
  • 北部艳阳高照、南部下冰雹,五一长假首日上海天气很“热闹”