Minimum Height Trees

題目

https://leetcode.com/problems/minimum-height-trees/#/description

分析

題目的要求是在一個沒有環的圖里,找一個節點作為根節點,將圖轉換成一棵樹,使樹的高度最小
先考慮最簡單的圖,每個節點只有一條邊進入和一條邊離開,這樣的圖退化成為一個鏈表。選取某一個節點作為Root時,樹的高度由根節點到左右兩側葉子節點的最大路徑決定。因此想要樹的高度最小,需要左右兩側的路徑大小盡可能接近。對于鏈表來說,中間節點就是我們的尋找的根節點,根據全部節點的個數不同,符合條件的根節點可能是一個或者兩個。尋找中間節點的算法很簡單,可以分別從左右兩個葉子節點以相同的速度前進,相遇的節點即是中間節點。


退化成鏈表的圖

回到題目中的場景:沒有環的圖,可以看作是多條鏈表,并且共用了一些節點。可以看出樹的高度是由最長的鏈表決定的,即圖中1-7的鏈表。尋找MHT根節點問題就轉化成了找到最長的鏈表的中間節點


沒有環的圖
算法
獲取所有葉子節點
while true
     從所有葉子節點出發,當前節點為葉子節點的下一個節點
     刪除所有葉子節點
     當前節點是否變為葉子節點?
        是:當前節點加入葉子節點
        否:表示有更長的路徑,舍棄掉此路徑
     葉子節點數量 <= 2
        使用鏈表中間節點算法找到根節點,結束   
實現代碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容