LeetCode | 0111. Minimum Depth of Binary Tree二叉樹的最小深度【Easy】【Python】【二叉樹】

LeetCode 0111. Minimum Depth of Binary Tree二叉樹的最小深度【Easy】【Python】【二叉樹】

Problem

LeetCode

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

Note: A leaf is a node with no children.

Example:

Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its minimum depth = 2.

問題

力扣

給定一個二叉樹,找出其最小深度。

最小深度是從根節(jié)點(diǎn)到最近葉子節(jié)點(diǎn)的最短路徑上的節(jié)點(diǎn)數(shù)量。

說明: 葉子節(jié)點(diǎn)是指沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。

示例:

給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

思路

解法一:DFS
對于每一個非葉子節(jié)點(diǎn),分別計算其左右子樹的最小葉子節(jié)點(diǎn)深度。

時間復(fù)雜度: O(n),n 是二叉樹的節(jié)點(diǎn)數(shù)。
空間復(fù)雜度: O(h),h 是二叉樹的高度。

Python3代碼
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        # solution one: DFS
        # 根為空
        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
解法二:BFS
找到一個葉子節(jié)點(diǎn)時,直接返回這個葉子節(jié)點(diǎn)的深度。

時間復(fù)雜度: O(n),n 是二叉樹的節(jié)點(diǎn)數(shù)。
空間復(fù)雜度: O(h),h 是二叉樹的高度。

Python3代碼
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        # solution two: BFS
        import collections
        # 根為空
        if not root:
            return 0
        
        que = collections.deque([(root, 1)])
        while que:
            node, depth = que.popleft()
            # 到達(dá)葉子節(jié)點(diǎn)
            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

GitHub鏈接

Python

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容