给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
1 2
| 输入:root = [3,9,20,null,null,15,7] 输出:2
|
示例 2:
1 2
| 输入:root = [2,null,3,null,4,null,5,null,6] 输出:5
|
解法
解法1 DFS
在遍历的过程将子节点的深度加入列表中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution: def minDepth(self, root: TreeNode) -> int: depth_dict = [] if not root: return 0 def dfs(root:TreeNode,depth): if not root: return 0 if not root.left and not root.right: depth_dict.append(depth) depth+=1 dfs(root.left,depth) dfs(root.right,depth)
dfs(root,0)
return min(depth_dict)+1
|
官方解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution: def minDepth(self, root: TreeNode) -> int: if not root: return 0 if not root.left and not root.right: return 1 min_depth = 10**9 if root.left: min_depth = min(self.minDepth(root.left), min_depth) if root.right: min_depth = min(self.minDepth(root.right), min_depth) return min_depth + 1
|
解法2 BFS
当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。
pooleft是用于collections的,弹出第一个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution: def minDepth(self, root: TreeNode) -> int: if not root: return 0
que = collections.deque([(root, 1)]) while que: node, depth = que.popleft() if not node.left and not node.right: return depth if node.left: que.append((node.left, depth + 1)) if node.right: que.append((node.right, depth + 1)) return 0
|