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
,right
childe.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
層的next
pointer。遍歷完第N
層的時候, 意味著第N + 1
層也已經透過next
pointer 串接起來了, 這時候cur
再往第N + 1
層移動
class Solution { |
- time:$O(n)$ ➔ 每個 node 皆被遍歷一次
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論