灵感来源
- 保持更新,努力学习
- python脚本学习
二叉树的最小深度
解题思路
这道题要求找出二叉树的最小深度,也就是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。解题的关键在于理解最小深度的定义,并处理好各种边界情况。
方法:广度优先搜索(BFS)
- 思路:使用广度优先搜索(BFS)遍历树,BFS 按照层级遍历节点,一旦遇到叶子节点(即没有左右子节点的节点),当前层级就是最小深度,直接返回即可。这种方法效率高,因为不需要遍历所有节点。
- 步骤:
- 如果根节点为空,直接返回 0。
- 初始化队列,将根节点加入队列,同时记录深度为 1。
- 循环遍历队列中的每个节点:
- 检查当前节点是否为叶子节点,如果是则返回当前深度。
- 否则,将其左右子节点(如果存在)加入队列,并将深度加 1。
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right from collections import deque class Solution: def minDepth(self, root: Optional[TreeNode]) -> int: if not root: return 0 queue = deque([(root, 1)]) while queue: node, depth = queue.popleft() # 检查是否是叶子节点 if not node.left and not node.right: return depth # 否则将子节点加入队列 if node.left: queue.append((node.left, depth + 1)) if node.right: queue.append((node.right, depth + 1)) return 0 # 实际上不会执行到这一步,因为树至少有一个节点
逐行解释
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
# 如果根节点为空,直接返回深度0
if not root:
return 0
# 初始化队列,使用双端队列实现BFS,队列元素为(节点, 当前深度)
queue = deque([(root, 1)])
# 开始BFS遍历
while queue:
# 从队列左侧取出节点和对应的深度
node, depth = queue.popleft()
# 检查当前节点是否是叶子节点(没有左右子节点)
# 如果是叶子节点,直接返回当前深度,即为最小深度
if not node.left and not node.right:
return depth
# 如果当前节点不是叶子节点,将其非空子节点加入队列
# 左子节点存在则加入队列,深度+1
if node.left:
queue.append((node.left, depth + 1))
# 右子节点存在则加入队列,深度+1
if node.right:
queue.append((node.right, depth + 1))
# 实际上不会执行到这一步,因为树至少有一个节点
# 为了代码完整性保留此返回语句
return 0