樹-廣度優先(圖)
阿新 • • 發佈:2020-08-06
310. 最小高度樹 對於一個具有樹特徵的無向圖,我們可選擇任何一個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的一個圖,寫出一個函式找到所有的最小高度樹並返回他們的根節點。 格式 該圖包含 n 個節點,標記為 0 到 n - 1。給定數字 n 和一個無向邊 edges 列表(每一個邊都是一對標籤)。 你可以假設沒有重複的邊會出現在 edges 中。由於所有的邊都是無向邊, [0, 1]和 [1, 0] 是相同的,因此不會同時出現在 edges 裡。 示例 1: 輸入: n = 4, edges = [[1, 0], [1, 2], [1, 3]] 0| 1 / \ 2 3 輸出: [1]
只要找到最長的那條路徑,返回最中間位置的節點即可。 我們將路徑記錄到graph這個dict中 然後從所有葉子節點開始BFS, 從節點i到達下一個節點j時, 我們直接從graph[j]中將前一個節點i移除, 然後判斷j的剩餘連線數,如果大於1, 則表明我們當前所在樹枝不是節點j連線的最長樹枝, 因為越短的枝,越早到達交匯處 我們終止遍歷,將此樹枝捨棄掉 如果連線數為1, 則表明我們當前所在的樹枝,有可能是最長的那個 將j新增到下一輪的遍歷中 最後,我們找不到下一輪的節點了 至此我們已經樹上的所有節點遍歷完成 返回這輪的所有節點即可 作者:vzp 連結:https:View Code//leetcode-cn.com/problems/minimum-height-trees/solution/python3-bfs-ti-jie-by-vzp/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
class Solution: def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]: graph = collections.defaultdict(set) for p, q inView Codeedges: graph[p].add(q) graph[q].add(p) nodes = [] for i in range(n): if len(graph[i]) < 2: nodes.append(i) while True: temp = [] for i in nodes: for j in graph[i]: graph[j].remove(i) if len(graph[j]) == 1: temp.append(j) if not temp: return nodes nodes = temp