返回

揭秘 LeetCode 111: 二叉树的最小深度 - 独辟蹊径,拨云见日

IOS

引言

在浩瀚的 LeetCode 算法题海中,一道看似简单的题目——二叉树的最小深度——却潜藏着别样的玄机。它既是对算法理解的考验,也是锻炼思维敏捷度的良机。本文将以独树一帜的视角,层层深入分析这道题目,带你领略二叉树遍历的奥秘。

先睹为快:算法思想

为了求解这道题目的关键,我们需要理解“最小深度”的含义。所谓最小深度,是指从根节点到最近叶节点的路径上的节点个数。换句话说,我们要找的是树中从上到下高度最矮的子树。

第一步:构建算法框架

算法框架是解决问题的基石。对于这道题,我们可以采用递归的方式来求解。递归函数的参数是一个二叉树的根节点,返回值则是该子树的最小深度。

第二步:递归求解

递归函数的实现需要考虑两种情况:

  1. 空树 :如果传入的根节点为空,则表示当前子树不存在,返回最小深度为 0。
  2. 非空树 :对于非空树,我们分别求出左右子树的最小深度,取其较小值加上 1,即可得到当前子树的最小深度。

第三步:边界情况处理

在递归求解的过程中,我们需要处理两个边界情况:

  1. 单子树 :如果当前子树只有一个子树(左或右),则我们直接返回该子树的最小深度。
  2. 空子树 :如果当前子树的某个子树为空,则我们认为该子树的最小深度为正无穷大,以便在后续求取较小值时不被选中。

代码实现

综合以上步骤,我们得到如下代码实现:

def min_depth(root):
  if not root:
    return 0
  if not root.left and not root.right:
    return 1
  min_left = min_depth(root.left) if root.left else float('inf')
  min_right = min_depth(root.right) if root.right else float('inf')
  return min(min_left, min_right) + 1

代码解读

代码首先判断根节点是否为空,如果是则返回 0。接下来,它分别判断左右子树是否存在,如果都存在则递归求解它们的最小深度。最后,它取左右子树最小深度的较小值并加 1,作为当前子树的最小深度。

实例演示

假设我们有一棵二叉树,其结构如下:

      1
     / \
    2   3
   / \
  4   5

按照算法框架,我们从根节点 1 开始递归求解:

  1. 左子树:根节点为 2,其左子树为空,右子树最小深度为 2(递归求得)。
  2. 右子树:根节点为 3,其左右子树均存在,最小深度为 2(递归求得)。
  3. 根节点 1:取左右子树最小深度的较小值(即 2),加 1,得到最小深度为 3。

结语

通过独到的视角和缜密的分析,我们成功解决了 LeetCode 111: 二叉树的最小深度。这道题目看似简单,却蕴含着算法和思维的双重考验。通过剖析算法框架、边界情况处理和代码实现,我们不仅掌握了这道题目的解法,更提升了对二叉树遍历和递归算法的理解。