前言
依旧是一道二叉树相关的题目。
本文提供这道题的思路和题解代码。
题目
思路
与常规的二叉树题目相似,本题可以从递归和迭代两种方向来思考。
从递归来看:
基本思路是,我们让返回值表示“深度”的概念,并不断递归搜集子树的最小深度,最后返回一个值(+1是因为我们的递归代码中深度从0开始,题目从1开始)
两种边界条件:节点不存在,直接判0;节点为叶节点,判1(自身的深度)
随后,我们用递归来获取左右子树的最小深度。
最后返回已经被维护好的min_depth变量即可(记得加一)。
从迭代来看:
因为需要FIFO先进先出方便取出同层节点,所以我们使用队列来处理这道题。
思路是,我们每次将队列中一层的所有节点全部依次取出,并分别检查他们是否为叶节点。
如果找到第一个叶节点,直接返回深度(这里深度初始值就是1,所以不用再+1了);
如果该节点不是叶节点,那么我们将其左右子节点再次放到队列中,并且在这轮“取出节点”全部完成后,深度加一,开启下一轮。
迭代的思路叶比较清晰,多看两遍代码就懂了。
题解代码
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
# 方法一:递归
if root is None:
return 0
if root.left is None and root.right is None:
return 1
min_depth = float('inf')
if root.right:
min_depth = min(self.minDepth(root.right),min_depth)
if root.left:
min_depth = min(self.minDepth(root.left),min_depth)
return min_depth+1
# 方法二:迭代
if root is None:
return 0
depth = 1
queue = [root]
while queue:
for i in range(len(queue)):
r = queue.pop(0)
if r.left is None and r.right is None:
return depth
if r.left:
queue.append(r.left)
if r.right:
queue.append(r.right)
depth += 1