題目
https://leetcode.com/problems/minimum-height-trees/#/description
分析
題目的要求是在一個沒有環的圖里,找一個節點作為根節點,將圖轉換成一棵樹,使樹的高度最小
先考慮最簡單的圖,每個節點只有一條邊進入和一條邊離開,這樣的圖退化成為一個鏈表。選取某一個節點作為Root時,樹的高度由根節點到左右兩側葉子節點的最大路徑決定。因此想要樹的高度最小,需要左右兩側的路徑大小盡可能接近。對于鏈表來說,中間節點就是我們的尋找的根節點,根據全部節點的個數不同,符合條件的根節點可能是一個或者兩個。尋找中間節點的算法很簡單,可以分別從左右兩個葉子節點以相同的速度前進,相遇的節點即是中間節點。
退化成鏈表的圖
回到題目中的場景:沒有環的圖,可以看作是多條鏈表,并且共用了一些節點。可以看出樹的高度是由最長的鏈表決定的,即圖中1-7的鏈表。尋找MHT根節點問題就轉化成了找到最長的鏈表的中間節點
沒有環的圖
算法
獲取所有葉子節點
while true
從所有葉子節點出發,當前節點為葉子節點的下一個節點
刪除所有葉子節點
當前節點是否變為葉子節點?
是:當前節點加入葉子節點
否:表示有更長的路徑,舍棄掉此路徑
葉子節點數量 <= 2
使用鏈表中間節點算法找到根節點,結束
實現代碼