116. Populating Next Right Pointers in Each Node
題目網址:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/
題意:給一 perfect BT, 其所有 leaf 皆在同一層, 且每個 non-leaf 皆有兩個 child。BT 定義如下:
填充每個 node 的
next, 讓next指向其右邊的 node。
若右邊沒有 node, 則指向NULL。所有next預設皆為NULL。進階:
- 設計 $O(1)$ space 的演算法
- 可以使用遞迴解題, 遞迴所用到的 stack space 不算做額外的 space

Solution 1:
想法:利用 BFS
class Solution { |
- time:$O(n)$ ➔ 每個 node 皆被遍歷一次
- space:$O(n)$ ➔ 撇除要返回的
res, 在 while loop 迭代的過程中,q的元素個數不超過n
Solution 2:
想法:利用 DFS, 使用 pre-order
- 先將
root->left->next指向root->right- 再將
root->right->next指向root->next->left(因為先前已經將 root->next 指向其右邊的 node)- 然後使用遞迴呼叫
left,rightchilde.g. 下圖中
第一次
dfs(root)的時候已經將a->next指向d第二次
dfs(a)時,b透過a指向c, 且c透過a->next = d指向e
class Solution { |
- time:$O(n)$ ➔ 每個 node 皆被遍歷一次
- space:$O(log(n))$ ➔ perfect BT 的深度為 $log(n)$
Solution 3:
想法:改進 Solution 2, 用 iterative 的方式將 space 降到 $O(1)$
cur由左至右遍歷第N層, 而nxt指向第N + 1層的第一個 node- while loop 中,
cur會將其 child 的next指向正確的 node- 若
cur走到第N層的結尾, 則cur移動到下一層(也就是nxt)當
cur遍歷第N層的時候,nxt會一邊串接起第N + 1層的nextpointer。遍歷完第N層的時候, 意味著第N + 1層也已經透過nextpointer 串接起來了, 這時候cur再往第N + 1層移動
class Solution { |
- time:$O(n)$ ➔ 每個 node 皆被遍歷一次
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論

