1. 程式人生 > 實用技巧 >樹-廣度優先(圖)

樹-廣度優先(圖)

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:
//leetcode-cn.com/problems/minimum-height-trees/solution/python3-bfs-ti-jie-by-vzp/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
View Code
class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        graph = collections.defaultdict(set)
        for p, q in
edges: 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
View Code