给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
递归方法:
分为四种情况:
1.当前节点为空,返回0,表示不算当前这一层,不进行计数。
2.当前节点左节点为空,右节点不为空。当前节点赋值给右节点并➕1。
3.当前节点右节点为空,左节点不为空。当前节点赋值给左节点并➕1。
4.当前节点的左右节点都不为空,通过min函数找到最小值并➕1。
(如果左右节点都为空,则再次调用该函数时返回0不计算结果)
BFS:
扫荡每一层节点,返回第一次出现叶子节点的层数即可。
递归1:
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root is None: return 0
if root.left is None: return self.minDepth(root.right)+1
if root.right is None: return self.minDepth(root.left)+1
return min(self.minDepth(root.left),self.minDepth(root.right))+1
递归2:
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root is None: return 0
if root.left is None and root.right is None: return 1
children = [root.left,root.right]
res = float("inf")
for c in children:
if c: #为了去除左节点或右节点有一个是None的情况
res = min(self.minDepth(c),res)
return res+1 #加1是加上了root那一层
BFS:
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root is None:
return 0
depth = 1
queue = [root]
while queue:
for i in range(len(queue)):
p = queue.pop(0)#切记要先取出
if p.left is None and p.right is None:
return depth
if p.left:
queue.append(p.left)
if p.right:
queue.append(p.right)
depth += 1
DFS:
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root is None:
return 0
self.ans = float('inf')
self._dfs(root, 1)
return self.ans
def _dfs(self, node, level):
if node is None:
return #当一条路径走到头时,判空
if node.left is None and node.right is None: #到叶子节点保存当前路径最小值
self.ans = min(self.ans,level)
self._dfs(node.left, level + 1) #如果左叶子节点依然存在,不执行下一行代码,直到左叶子节点到头为止
self._dfs(node.right, level + 1)
题目讲解