解題說明
Maximum Level Sum of a Binary Tree
題目描述:給定一棵二元樹,求節點值之和最大的層數(根節點在第 1 層)。若多層和相同,回傳最小的層數。
解題思路:使用廣度優先搜尋(BFS)逐層遍歷二元樹。維護一個佇列,每次處理完整的一層節點,計算該層所有節點值之和。同時追蹤目前為止的最大層和及對應層數。由於題目要求和相同時取最小層數,只在發現嚴格更大的和時才更新答案,這樣天然保證了返回最小層數。BFS 的層序遍歷結構與此題需求完美契合。
C++ 解法
複雜度分析
時間複雜度:O(n) — 每個節點恰好被訪問一次。
空間複雜度:O(w) — 佇列最多同時存放寬度最大的那一層節點,最壞為 O(n/2) = O(n)(完滿二元樹的最底層)。
虛擬碼
1. Push root into queue; set maxSum = -INF, bestLevel = 1, level = 0
2. While queue not empty:
a. level++
b. size = current queue size
c. levelSum = 0
d. For i in 0..size-1:
- Dequeue node
- levelSum += node.val
- Enqueue left and right children if exist
e. If levelSum > maxSum: update maxSum and bestLevel = level
3. Return bestLevel其他解法
DFS + 層和陣列:深度優先搜尋時記錄每個節點所在層數,累加到對應層的和陣列中。最後掃描陣列找最大值。空間複雜度 O(n) 但要額外儲存所有層和,不如 BFS 直觀。
遞迴 BFS 模擬:用兩個 vector 交替存放當前層和下一層節點,避免 queue 的開銷。邏輯等價但常數因子略有差異。
延伸思考
- 如果改為求節點值之積最大的層,需要注意哪些邊界情況(如負數)?
- 如何修改此解法以同時找出和最大的層的所有節點值?
- 若樹非常寬(寬度遠大於深度),DFS 和 BFS 在空間使用上各有什麼優劣?