1、题目描述
https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
同类题:DFS-LeetCode104. 二叉树的最大深度 https://blog.csdn.net/IOT_victor/article/details/107021517
两题区别:https://leetcode.wang/leetcode-111-Minimum-Depth-of-Binary-Tree.html
2、代码详解
递归写法:关键是搞清楚递归结束条件
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def minDepth(self, root):
'''
叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
1. 当 root 节点左右孩子都为空时,返回 1
2. 当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
3. 当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值
'''
if not root:
return 0
left_min = self.minDepth(root.left)
right_min = self.minDepth(root.right)
if not root.left and not root.right: # 情况 1
return 1
# elif not root.left or not root.right: # 情况 2
# return left_min + 1 if root.left else right_min + 1
elif root.left == None:
return right_min + 1 # 左孩子为空,只考虑右孩子的方向
elif root.right == None:
return left_min + 1 # 右孩子为空,只考虑左孩子的方向
else: # 情况 3
return min(left_min, right_min) + 1
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def minDepth(self, root):
'''
叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
1. 当 root 节点左右孩子都为空时,返回 1
2. 当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
3. 当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值
'''
if not root:
return 0
left_min = self.minDepth(root.left)
right_min = self.minDepth(root.right)
if not root.left and not root.right: # 情况 1
return 1
elif not root.left or not root.right: # 情况 2
return left_min + 1 if root.left else right_min + 1
else: # 情况 3
return min(left_min, right_min) + 1
其他解法:
BFS迭代,DFS迭代