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
實現結果
實現結果 # 遞迴
實現結果 # 廣度優先搜尋
歡迎關注
公眾號 【書所集錄】