題目描述:給定一棵二元樹的根節點,返回一個陣列,其中第 i 個元素代表第 i 層(從 0 開始)所有節點值的平均數。答案誤差在 10^-5 以內皆可接受。
解題思路:使用廣度優先搜尋(BFS)逐層處理。每一輪迴圈開始時,queue 中恰好存放同一層的所有節點。記錄該層的節點數量 sz,然後依序彈出 sz 個節點,將節點值累加到 sum(使用 double 型態以避免整數溢位——節點值最大為 10^4,一層最多 2^h 個節點),並將子節點推入 queue 以備下一層使用。處理完一層後,計算平均值 sum / sz 並加入結果陣列。重複直到 queue 為空。
時間複雜度:O(n) — 每個節點恰好入 queue 和出 queue 各一次,其中 n 為節點總數。
空間複雜度:O(w) — queue 同時最多存放一層的節點,w 為樹的最大寬度。最差情況(完全二元樹最底層)為 O(n/2) = O(n);平衡樹約為 O(n);鏈狀樹(退化)為 O(1)。
1. Initialize result as empty array
2. If root is null: return result
3. Initialize queue q and push root
4. While q is not empty:
a. sz = q.size() (number of nodes at current level)
b. sum = 0.0 (use double)
c. For i from 0 to sz-1:
i. node = q.front(); q.pop()
ii. sum += node.val
iii. If node.left exists: push node.left
iv. If node.right exists: push node.right
d. Append (sum / sz) to result
5. Return result方法一:DFS 搭配層級索引
用 DFS 遍歷樹,同時傳遞當前層級 level。維護兩個陣列 sums[level] 和 counts[level],遞迴時分別累加節點值和計數。遍歷完成後逐層計算平均。時間複雜度 O(n),空間複雜度 O(h)(遞迴堆疊)。相比 BFS 稍複雜,但在樹的寬度遠大於深度時記憶體使用更省。
方法二:兩個 Vector 交替 不使用 queue,改用兩個 vector 分別代表「當前層」和「下一層」,交替清空與填充。每處理完一層,交換兩個 vector。這種方式更容易直接取得當前層的大小,但額外空間與 BFS queue 相近,為 O(w)。
double 或 long double 而非 long long 來儲存 sum。