1. 程式人生 > 實用技巧 >LeetCode 104. 二叉樹的最大深度 | Python

LeetCode 104. 二叉樹的最大深度 | Python

104. 二叉樹的最大深度


題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

題目


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

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

示例:

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

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

解題思路


思路:遞迴、廣度優先搜尋

題目中提示,【二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數】。那麼在這裡,我們考慮從遞迴和廣度優先搜尋的思路去解決此問題。下面先從遞迴的思路,對問題進行分析解決。

遞迴

根據題目的提示,我們知道,二叉樹的深度是跟它的左右子樹的深度有關。

前面說,二叉樹的深度是根節點到最遠葉子節點的最長路徑上的節點數,那麼也就說當我們得到左子樹和右子樹的最大深度時,只要取兩者中較大深度的加上根節點的深度就是整個二叉樹的深度。那麼也就是說:二叉樹的最大深度 = 左右子樹最大深度較大的深度 + 根節點的高度。如下面的式子:

max_depth = max(left_tree_depth, right_tree_depth) + 1

那麼現在的問題就是如何去求左右子樹的最大深度,在這裡,兩者的計算方式是相同的。我們可以遞迴去計算左右子樹的最大深度,當遇到葉子節點時,退出遞迴。

具體的程式碼見【程式碼實現 # 遞迴】

廣度優先搜尋

這裡,我們也可以使用廣度優先搜尋的思路來解決問題。在這裡,我們需要新增一個輔助佇列。我們將當前層的所有節點都存入這個輔助佇列中。

在這裡需要注意一點,當我們準備搜尋下一層時,這裡需要將佇列中當前層的所有節點都進行出隊,然後讓這些節點往下層搜尋。

那麼,如果當前層的所有節點都出列,佇列還非空,那麼說明下一層還有節點。迴圈直至佇列為空,定義變數 depth,每層搜尋的時候維護更新該值,那麼最終,depth 就是我們要求的二叉樹最大深度。

具體的程式碼見【程式碼實現 # 廣度優先搜尋】

程式碼實現


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

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        # 終止條件
        if not root:
            return 0

        # 遞迴計算左右子樹的最大深度
        left_tree_depth = self.maxDepth(root.left)
        right_tree_depth = self.maxDepth(root.right)

        return max(left_tree_depth, right_tree_depth) + 1

# 廣度優先搜尋
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        # 處理特殊情況
        if not root:
            return 0

        from collections import deque
        # 輔助佇列
        queue = deque()

        # 記錄二叉樹深度,維護更新,
        depth = 0

        queue.append(root)

        while queue:
            # 當前層所有節點出列,往下搜尋
            size = len(queue)

            for i in range(size):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)

            depth += 1
        
        return depth

實現結果


實現結果 # 遞迴

實現結果 # 廣度優先搜尋

歡迎關注


公眾號 【書所集錄