經典圖論題 Amount of Time for Binary Tree to Be Infected_2385

閱讀時間約 6 分鐘

題目敘述

題目會給定我們一棵二元數Binary Tree的根結點。

並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹?

題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [1,5,3,null,4,10,6,9,2], start = 3
Output: 4
Explanation: The following nodes are infected during:
- Minute 0: Node 3
- Minute 1: Nodes 1, 10 and 6
- Minute 2: Node 5
- Minute 3: Node 4
- Minute 4: Nodes 9 and 2
It takes 4 minutes for the whole tree to be infected so we return 4.

Example 2:

raw-image
Input: root = [1], start = 1
Output: 0
Explanation: At minute 0, the only node in the tree is infected so we return 0.

約束條件

Constraints:

  • The number of nodes in the tree is in the range [1, 10^5].
  • 1 <= Node.val <= 10^5
  • Each node has a unique value.
  • A node with a value of start exists in the tree.

演算法

其實,二元樹Binary tree本身也是一種圖Graph,轉換成圖之後,要解開就非常容易了。

因為,最少需要多少時間去感染整棵樹 = 最少需要多少時間,去拜訪整張圖。

我們就把原本感染的問題映射到圖上的拜訪Traversal問題去解開來。


第一步:

先用DFS深度優先演算法建立整張圖,也就是把二元樹的連結關係相鄰陣列的方式來表達

第二步:

再用BFS廣度優先演算法,從感染的起點開始,拜訪整張圖,所需的時間就是感染整顆樹的時間。(BFS先天具有點波源擴散的性質)


程式碼

class Solution: 		
def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
graph = defaultdict(list)

# Build connected graph for binary tree in DFS
def dfs(node, parent):

if not node:
return

if parent:
graph[node.val].append(parent.val)
graph[parent.val].append(node.val)

dfs(node.left, node)
dfs(node.right, node)
return
#--------------------------------------
dfs(root, None)

# Start infection from start node, with BFS, which naturally has shortest path
bfs_queue = deque( [ (start, 0) ] )
visited = set([start])

while bfs_queue:

for _ in range( len(bfs_queue) ):
cur, step = bfs_queue.popleft()

for neighbor in graph[cur]:
if neighbor not in visited:
visited.add(neighbor)
bfs_queue.append( (neighbor, step+1) )

return step


關鍵知識點

二元樹Binary tree本身也是一種圖Graph,轉換成圖之後,要解開就非常容易了。

因為,最少需要多少時間去感染整棵樹 = 最少需要多少時間,去拜訪整張圖。


另外,BFS先天具有點波源擴散的性質,所以在無權重的圖中,也具有尋找最短路徑的特質。在這題,就是利用這個特質,來找出最少需要多少時間來拜訪整張圖(相當於感染整棵樹)


複雜度分析

時間複雜度:

O(n) DFS和BFS拜訪整張圖,每個節點至多分別拜訪一次,O(2n) = O(n)。

空間複雜度:

O(n) DFS和BFS拜訪整張圖,最大深度發生在整棵樹向左歪斜或者向右歪斜時 = O(n)。

另外,建立graph的相連矩陣時,也需要耗費O(n)的空間。


Reference:

[1] Python by DFS + BFS [w/ Comment]

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
乍看之下會以為這本書偏搞笑類型,的確是有點搞笑,可是內容也是蠻豐富的喔,尤其是細讀作者在每一個動作之下的文字敘述,會覺得真的有認真仔細地觀察。收錄在書末與三浦純的對談也很有意思,最後兩人一起為這本書下了一個結論───
Thumbnail
WBC棒球經典賽的選手來自臺灣各地,究竟哪裡的人最多呢?仔細研究可以發現,其中還有不少人是同一所小學畢業的。
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
孩子們都很期待過聖誕節,因為這是一個可以拿禮物的日子,還可以欣賞漂亮的聖誕樹和閃亮亮的燈飾,真的是滿滿的幸福感呢。不過說到送禮物,每家規定不同,而禮物不嫌多,如果可以有更多禮物,誰會覺得不好呢!
Thumbnail
心智圖發想法(純文字版)練習方法 首先把要解決問題的關鍵字,寫出來, 接著我們再把和關鍵字有關的類別列出來, 作練習的過程當中如果中途想到甚麼, 都可以隨時補充! 點子大富翁們,開始練習吧! 關鍵字: 老舊書店
Thumbnail
之前去土耳其自由行時,意外發現當地香水文化非常興盛,而且最有趣的是,隨處可見各種香水專賣店不說,還不少標榜「複刻」經典專櫃品牌香水,媽媽我想長住土耳其!(毆)
Thumbnail
歡迎大家來到圖解力的經典好書分享,我是你的圖解力教練奕霖! 談到圖像思維、視覺筆記,我們第一直覺聯想到的可能就像上面這張圖的筆記一樣,運用圖文方式整理資訊,讓內容變得吸睛、活潑、有趣、好記憶! 自2016年我接觸到視覺記錄到視覺筆記實踐的那幾年,我也是這麼想的。 一、 圖解思考的原則與元素  
Thumbnail
如何用一張紙,搞定工作報告、簡報設計、會議記錄、業務交接等職場大小事?作者在這本書中做了完整的詮釋,也讓我們看見了就算不會畫圖,也能透過圖像框架的思維,來有效提升我們工作生產力,歡迎大家可以動手來試試
Thumbnail
E 引言 很多即使不熟悉CSGO游戲的朋友或多或少地聽說過一些出圈的CSGO術語。 比如下面兩個經典的出圈梗 Rush B 中門對狙 當然了,絕大多數時候我們在使用這些梗的時候都帶著調侃或惡搞的意味。 事實上CSGO中的戰術遠不止於此,哪怕在戰術變化最單一的Dust2上也有著一些圈外
Thumbnail
從留長髮這件事,本宅慢慢發現何謂「男性凝視」,那些因為留長髮自然而然產生的動作,搖身一變成為「性感的象徵」。還給那些自然而然的動作該有的意義,是離開父權社會和男性凝視的一種方法,而縱使性別有無法跨越的鴻溝,我們依然能透過「確認自己不可能擁有的經驗」而畫出我們行使謙卑的範圍。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
乍看之下會以為這本書偏搞笑類型,的確是有點搞笑,可是內容也是蠻豐富的喔,尤其是細讀作者在每一個動作之下的文字敘述,會覺得真的有認真仔細地觀察。收錄在書末與三浦純的對談也很有意思,最後兩人一起為這本書下了一個結論───
Thumbnail
WBC棒球經典賽的選手來自臺灣各地,究竟哪裡的人最多呢?仔細研究可以發現,其中還有不少人是同一所小學畢業的。
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
孩子們都很期待過聖誕節,因為這是一個可以拿禮物的日子,還可以欣賞漂亮的聖誕樹和閃亮亮的燈飾,真的是滿滿的幸福感呢。不過說到送禮物,每家規定不同,而禮物不嫌多,如果可以有更多禮物,誰會覺得不好呢!
Thumbnail
心智圖發想法(純文字版)練習方法 首先把要解決問題的關鍵字,寫出來, 接著我們再把和關鍵字有關的類別列出來, 作練習的過程當中如果中途想到甚麼, 都可以隨時補充! 點子大富翁們,開始練習吧! 關鍵字: 老舊書店
Thumbnail
之前去土耳其自由行時,意外發現當地香水文化非常興盛,而且最有趣的是,隨處可見各種香水專賣店不說,還不少標榜「複刻」經典專櫃品牌香水,媽媽我想長住土耳其!(毆)
Thumbnail
歡迎大家來到圖解力的經典好書分享,我是你的圖解力教練奕霖! 談到圖像思維、視覺筆記,我們第一直覺聯想到的可能就像上面這張圖的筆記一樣,運用圖文方式整理資訊,讓內容變得吸睛、活潑、有趣、好記憶! 自2016年我接觸到視覺記錄到視覺筆記實踐的那幾年,我也是這麼想的。 一、 圖解思考的原則與元素  
Thumbnail
如何用一張紙,搞定工作報告、簡報設計、會議記錄、業務交接等職場大小事?作者在這本書中做了完整的詮釋,也讓我們看見了就算不會畫圖,也能透過圖像框架的思維,來有效提升我們工作生產力,歡迎大家可以動手來試試
Thumbnail
E 引言 很多即使不熟悉CSGO游戲的朋友或多或少地聽說過一些出圈的CSGO術語。 比如下面兩個經典的出圈梗 Rush B 中門對狙 當然了,絕大多數時候我們在使用這些梗的時候都帶著調侃或惡搞的意味。 事實上CSGO中的戰術遠不止於此,哪怕在戰術變化最單一的Dust2上也有著一些圈外
Thumbnail
從留長髮這件事,本宅慢慢發現何謂「男性凝視」,那些因為留長髮自然而然產生的動作,搖身一變成為「性感的象徵」。還給那些自然而然的動作該有的意義,是離開父權社會和男性凝視的一種方法,而縱使性別有無法跨越的鴻溝,我們依然能透過「確認自己不可能擁有的經驗」而畫出我們行使謙卑的範圍。