返回
揭秘 LeetCode 111: 二叉树的最小深度 - 独辟蹊径,拨云见日
IOS
2023-11-04 18:31:17
引言
在浩瀚的 LeetCode 算法题海中,一道看似简单的题目——二叉树的最小深度——却潜藏着别样的玄机。它既是对算法理解的考验,也是锻炼思维敏捷度的良机。本文将以独树一帜的视角,层层深入分析这道题目,带你领略二叉树遍历的奥秘。
先睹为快:算法思想
为了求解这道题目的关键,我们需要理解“最小深度”的含义。所谓最小深度,是指从根节点到最近叶节点的路径上的节点个数。换句话说,我们要找的是树中从上到下高度最矮的子树。
第一步:构建算法框架
算法框架是解决问题的基石。对于这道题,我们可以采用递归的方式来求解。递归函数的参数是一个二叉树的根节点,返回值则是该子树的最小深度。
第二步:递归求解
递归函数的实现需要考虑两种情况:
- 空树 :如果传入的根节点为空,则表示当前子树不存在,返回最小深度为 0。
- 非空树 :对于非空树,我们分别求出左右子树的最小深度,取其较小值加上 1,即可得到当前子树的最小深度。
第三步:边界情况处理
在递归求解的过程中,我们需要处理两个边界情况:
- 单子树 :如果当前子树只有一个子树(左或右),则我们直接返回该子树的最小深度。
- 空子树 :如果当前子树的某个子树为空,则我们认为该子树的最小深度为正无穷大,以便在后续求取较小值时不被选中。
代码实现
综合以上步骤,我们得到如下代码实现:
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 开始递归求解:
- 左子树:根节点为 2,其左子树为空,右子树最小深度为 2(递归求得)。
- 右子树:根节点为 3,其左右子树均存在,最小深度为 2(递归求得)。
- 根节点 1:取左右子树最小深度的较小值(即 2),加 1,得到最小深度为 3。
结语
通过独到的视角和缜密的分析,我们成功解决了 LeetCode 111: 二叉树的最小深度。这道题目看似简单,却蕴含着算法和思维的双重考验。通过剖析算法框架、边界情况处理和代码实现,我们不仅掌握了这道题目的解法,更提升了对二叉树遍历和递归算法的理解。