二叉树的最小深度——和最大深度一样的逻辑?

引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法 ,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考 。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

二叉树的最小深度

leetcode题目链接

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

题目分析

求解这道题目,有多种方式,可以使用DFS的递归方式求解,也可以使用BFS层序遍历来求解。

递归方式

还是按照递归三部曲

  1. 确定递归函数的参数和返回值以及他们的意义

我们来看下题目提供的函数能否满足条件

ts 复制代码
function minDepth(root: TreeNode | null): number {
  
};

这个函数的参数是一个根节点,返回值是一个数字,表示这个数的最小深度。那么这个是否可以直接作为我们的递归函数呢?我们还是来分析原始问题和子问题的性质是否相同 ,左右子树的最小深度和整棵树的最小深度有没有关系呢?答案是肯定的,整棵树的的最大深度不就是左右子树最大深度的最大值中较小的那一个再+1 吗?+1加的是根节点自身的高度。

所以题目的函数是可以直接用作递归函数的。

  1. 确定终止条件

当前根节点为null时终止,返回0即可。

  1. 确定单层递归逻辑

用技巧,我们只考虑最外层的递归,就是根节点那里。所以首先对左右子树分别求最小深度,然后求出两者之间较小的那一个,然后+1返回即可。但是这里有一个坑 ,如果左右子树中有一个是null的话,这个是不能算的。因为最小深度要求的是根节点到最近的叶子节点路径上的节点数量,如果左右子树根节点是null,根本就没有叶子节点。所以不能直接简单地求两个子树的最小深度中较小的那一个,还需要排除掉为null的情况。

层序遍历方式

层序遍历要利用队列来进行。首先初始化最大深度为0,然后按照正常的层序遍历方式,在每一层遍历开始时,将最大深度+1,不用进行实际的的遍历节点存储,,因为我们并不需要返回遍历结果。一旦遍历过程中某个节点是叶子结点,(根据!node.left && !node.right即可判断),则直接返回当前层的深度,就是最小深度。

题解

递归方式

ts 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function minDepth(root: TreeNode | null): number {
  // 终止条件
  if (!root) return 0;

  // 如果左子树为空,则只能要右子树的
  if (!root.left) return minDepth(root.right) + 1;

  // 如果右子树为空,则只能要左子树
  if (!root.right) return minDepth(root.left) + 1;

  // 左右子树都不为空时,要两者中最小的
  return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
}

时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)

空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( h ) O(h) </math>O(h), h是树的高度

层序遍历方式

ts 复制代码
function minDepth(root: TreeNode | null): number {
  // 剪枝
  if (!root) return 0;

  // 辅助队列
  const queue: TreeNode[] = [];

  // 最小深度
  let minDepth = 0;

  // 根节点入队
  queue.push(root);

  // 当队列非空时,开始遍历
  while (queue.length) {
    // 保留当前层节点个数
    const len = queue.length;

    // 深度 + 1
    minDepth++;

    // 遍历当前层
    for (let i = 0; i < len; i++) {
      // 出队
      const node = queue.shift();

      // 如果当前节点无子节点,返回当前深度
      if (!node.left && !node.right) return minDepth;

      // 左子节点入队
      node.left && queue.push(node.left);

      // 右子节点入队
      node.right && queue.push(node.right);
    }
  }
}

时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)

空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)

总结

本题考察二叉树的最小深度,要搞清楚定义,二叉树的最小深度指的是从根节点到最近的叶子节点的路径上的节点数。在单层递归逻辑中的易错点一定要注意,不能直接返回左右子树最小深度中最小的,因为可能有空树。空树要直接排除。

感兴趣的同学可以订阅本专栏刷爆leetcode,持续更新。

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,一起学习前端知识,我们下期见!

相关推荐
孟柯coding6 分钟前
常见排序算法
数据结构·算法·排序算法
Point11 分钟前
[LeetCode] 最长连续序列
前端·javascript·算法
是阿建吖!17 分钟前
【优选算法】链表
数据结构·算法·链表
kev_gogo18 分钟前
关于回归决策树CART生成算法中的最优化算法详解
算法·决策树·回归
夜影风39 分钟前
23种常用设计模式介绍
设计模式
YoseZang40 分钟前
【设计模式】GoF设计模式之代理模式(Proxy Pattern)
设计模式·代理模式
叫我:松哥1 小时前
优秀案例:基于python django的智能家居销售数据采集和分析系统设计与实现,使用混合推荐算法和LSTM算法情感分析
爬虫·python·算法·django·lstm·智能家居·推荐算法
知其然亦知其所以然1 小时前
社招 MySQL 面试官问我:InnoDB 的 4 大特性?我靠这 4 个故事一战封神!
后端·mysql·面试
hqxstudying1 小时前
J2EE模式---业务代表模式
java·前端·python·设计模式·java-ee·mvc
chenyy23333 小时前
2025.7.25动态规划再复习总结
算法·动态规划