題目連結:
題目意譯:
你被給定一棵節點值皆相異的二元樹之根節點 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,而且可以塞在同一次(同一個函式)探訪之中。有興趣的讀者可以參見範例程式碼。
大提示:每個節點的遞迴結果分成兩個部分。一個是「深度」,另一個則是「感染所需分鐘數」。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。