WordPress 個人部落格1.0版
阿新 • • 發佈:2021-02-08
難度:簡單
輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。
例如:
給定二叉樹 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
解題思路:
這種題目無非就是遍歷樹,遍歷的方法有兩種——深度優先搜尋(DFS)和廣度優先搜尋(BFS)。
DFS:
DFS需要注意的是每次遞迴返回的時候需要比較左子樹和右子樹的最大深度,而不是加和,不然會計算重複。
BFS:
BFS沒有需要特別注意的,就是傳統利用佇列遍歷,關注佇列是否為空,然後每遍歷一層佇列,就加入下一層。
python程式碼:
# DFS
class Solution:
def maxDepth(self, root: TreeNode) -> int:
return self.deSearch(root)
def deSearch(self, root):
if not root:
return 0
l_depth = self.deSearch(root.left)
r_depth = self.deSearch(root.right)
max_depth = max (l_depth, r_depth)
return max_depth+1
複雜度分析:
- 時間複雜度 O ( N ) O(N) O(N): N N N是節點的數目,我們需要遍歷所有節點;
- 空間複雜度 O ( N ) O(N) O(N):這裡只能討論最差的情況,最差的情況是這棵樹是一個連結串列,遞迴的深度為 N N N。
# BFS
class Solution:
def maxDepth(self, root: TreeNode) -> int:
return self.brSearch(root)
def brSearch(self, root):
if not root: return 0
depth = 0
queue = [root]
while queue:
tmp = []
for node in queue:
if node.left: tmp.append(node.left)
if node.right: tmp.append(node.right)
queue = tmp
depth += 1
return depth
複雜度分析:
- 時間複雜度 O ( N ) O(N) O(N): N N N是節點的數目,跟DFS一樣,我們需要遍歷所有節點;
- 空間複雜度 O ( N ) O(N) O(N):這裡也是最差的情況,當樹是完全二叉樹的情況下,佇列需要同時儲存 N / 2 + 1 N/2+1 N/2+1。