二叉树的最小深度
- 题目
- 题目描述
- 示例 1:
- 示例 2:
- 提示:
- 题解
- 方法一:广度优先搜索(BFS)
- 实现步骤:
- python实现
- 提交结果
- 方法二:递归
- 实现步骤:
- python实现
- 提交结果
题目
题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
提示:
树中节点数的范围在 [0, 1 0 5 10^5 105] 内
-1000 <= Node.val <= 1000
题解
为了找出二叉树的最小深度,我们可以采用广度优先搜索(BFS)或者递归的方法。使用广度优先搜索可以确保我们找到的第一个叶子节点就是最短路径上的节点,因为BFS是逐层探索的。而递归方法则可以通过计算左右子树的最小深度来确定。
方法一:广度优先搜索(BFS)
BFS是一种分层遍历图或树的数据结构算法。对于这个问题,它特别有用,因为它能保证第一次遇到的叶子节点就是距离根节点最近的那个。
实现步骤:
- 如果根节点为空,返回0。
- 初始化一个队列,并将根节点加入队列中,同时初始化深度为1。
- 开始层次遍历:
- 对于当前层的所有节点,检查它们是否为叶子节点(即没有左子节点和右子节点)。如果是,则返回当前深度。
- 如果不是叶子节点,则将其非空的子节点加入队列。
- 每完成一层遍历后,增加深度计数。
- 当队列为空时,说明所有节点都已遍历完毕(虽然根据题目条件,在找到第一个叶子节点时就会返回结果)。
python实现
def minDepth(root: TreeNode) -> int:if not root:return 0queue = deque([(root, 1)])while queue:node, depth = queue.popleft()# 判断是否为叶子节点if not node.left and not node.right:return depthif node.left:queue.append((node.left, depth + 1))if node.right:queue.append((node.right, depth + 1))return 0 # 这行实际上不会达到,因为有叶子节点时就会返回
提交结果
方法二:递归
通过递归的方式也可以解决问题,但需要注意的是,如果只简单地取左右子树深度的最小值,可能会误判。例如,在一个只有右子树的情况下,直接取 min(left, right)
会导致错误的结果(因为当一边为空时,其深度应视为无穷大而不是0)。
实现步骤:
- 如果当前节点为空,返回0。
- 递归计算左右子树的最小深度。
- 如果某一边子树为空,则该方向的深度视为最大值,从而确保我们总是选择存在的一边进行比较。
python实现
def minDepth(root: TreeNode) -> int:if not root:return 0left_depth = minDepth(root.left)right_depth = minDepth(root.right)# 若左或右子树有一个为空,则返回非空子树的深度加1;否则返回较小深度加1if not root.left or not root.right:return max(left_depth, right_depth) + 1else:return min(left_depth, right_depth) + 1
提交结果
这两种方法都可以有效地解决问题。BFS方法在找到最近的叶子节点时立即停止,效率较高;而递归方法更加简洁,但在极端情况下(如树非常不平衡时)可能不如BFS高效。根据具体情况选择合适的方法即可。