前往
大廳
主題

LeetCode - 2385. Amount of Time for Binary Tree to Be Infected 解題心得

Not In My Back Yard | 2023-07-14 12:00:20 | 巴幣 0 | 人氣 219

題目連結:


題目意譯:
你被給定一棵節點值皆相異的二元樹之根節點 root,以及一整數 start。在第 0 分鐘,有一例感染開始於數值為 start 的節點。

每一分鐘,如果以下情況皆為真,則某節點將被感染:
該節點目前尚未被感染;
該節點相鄰於一個被感染的節點。

回傳整棵樹被感染所需的分鐘數。

限制:
樹中的節點數位於範圍 [1, 10 ^ 5] 中。
1 ≦ Node.val ≦ 10 ^ 5
每個節點值彼此相異。
有著節點值 start 的節點必定存在於樹中。



範例測資:
範例 1:
輸入: root = [1,5,3,null,4,10,6,9,2], start = 3
輸出: 4
解釋: 以下節點的感染時間點各自為:
- 第 0 分鐘:節點 3
- 第 1 分鐘:節點 1 、 10 和 6
- 第 2 分鐘:節點 5
- 第 3 分鐘:節點 4
- 第 4 分鐘:節點 9 和 2
整棵樹需要 4 分鐘才會全數感染,所以我們回傳 4。

範例 2:
輸入: root = [1], start = 1
輸出: 0
解釋: 在第 0 分鐘,樹中唯一的節點被感染了,所以我們回傳 0。


解題思維:
典型的廣度優先搜尋(Breadth First Search,BFS)題型,不過前提是你要先知道節點值為 start 的節點在哪。而它的位置可以由深度優先搜尋(Depth First Search,DFS)或是另一次 BFS 而找到。

一旦找到,並且你在找尋該目標節點(稱其為 X)的過程順便把每個節點的父節點建立出來(為了等下方便),此時你就可以從 X 出發利用 BFS 的精神擴散出去(如這題等)。在擴散的過程中統計「步數」(即題目中的分鐘數),最後即可知道需要多少分鐘才能感染全部節點。



不過實際上也可以直接進行 DFS,而且可以塞在同一次(同一個函式)探訪之中。有興趣的讀者可以參見範例程式碼。

大提示:每個節點的遞迴結果分成兩個部分。一個是「深度」,另一個則是「感染所需分鐘數」。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作