題源:https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/
題目描述:
思路一:
使用 DFS 遞歸遍歷的解法,每當遍歷到一條樹枝的葉子節點,就會更新最小深度,當遍歷完整棵樹后,就能算出整棵樹的最小深度。
代碼如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def __init__(self):# 記錄最小深度(根節點到最近的葉子節點的距離)self.minDepthValue = float('inf')# 記錄當前遍歷到的節點深度self.currentDepth = 0def minDepth(self, root):""":type root: Optional[TreeNode]:rtype: int"""if root is None:return 0# 從根節點開始遍歷self.traverse(root)return self.minDepthValuedef traverse(self, root): if root is None:return None# 在二叉樹的前序位置進入節點時增加當前深度self.currentDepth += 1# 如果當前節點是葉子節點,更新最小深度if root.left is None and root.right is None:self.minDepthValue = min(self.minDepthValue, self.currentDepth)self.traverse(root.left)self.traverse(root.right)# 在二叉樹的后序位置離開節點時減少當前深度self.currentDepth -= 1
執行時間如下,可以看出,DFS算法速度較慢,因為該算法必須確切的知道每條樹枝的深度(根節點到葉子節點的距離),才能找到最小的那個:
思路二:
使用 BFS 層序遍歷的解法。按照 BFS 從上到下逐層遍歷二叉樹的特點,當遍歷到第一個葉子節點時,就能得到最小深度。
代碼如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def minDepth(self, root):""":type root: Optional[TreeNode]:rtype: int"""if root is None:return 0q = deque([root])# root 本身就是一層, depth 初始化為1depth = 1while q:sz = len(q)# 遍歷當前層的節點for _ in range(sz):cur = q.popleft()# 判斷是否到達葉子節點if cur.left is None and cur.right is None:return depth# 將下一層節點加入隊列if cur.left is not None:q.append(cur.left)if cur.right is not None:q.append(cur.right)# 增加深度depth += 1return depth
執行時間如下,由于 BFS 逐層遍歷的邏輯,第一次遇到目標節點時,所經過的路徑就是最短路徑,算法可能并不需要遍歷完所有節點就能提前結束: