leetcode310 最小高度樹 拓撲排序

2021-10-07 20:04:54 字數 1383 閱讀 6627

對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。

格式該圖包含 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

]

示例 2:

輸入: n =

6, edges =[[

0,3]

,[1,

3],[

2,3]

,[4,

3],[

5,4]

]012

\ |/3

|4|5

輸出:[3,

4]

說明:

先來說下這道題:題目中給的圖的結構一定能夠轉化成一棵樹,並且可以以任何乙個節點為根(看題目要求),所謂最小高度樹就是以圖中每乙個節點為根的樹的最長路徑(樹的高度)中最短的

暴力思想:求以每乙個節點為根的樹的高度,可以bfs,也可以dfs,這兩種思想都超時了,就不再給出**了。

巧妙思想:一層一層刪除度為1的節點,節點刪除了,對應的邊也遞減,當剩下的節點不超過兩個節點時,就是結果。這裡有點像拓撲排序。

class

solution

; vectorint>>

graph

(n);

vector<

int>

degree

(n,0);

for(

auto e : edges)

queue<

int> q;

int cnt = n;

for(

int i =

0; i < n;

++i)

}while

(cnt >2)

}}}}

vector<

int> res;

while

(!q.

empty()

)return res;}}

;

Leetcode 310 最小高度樹

對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...

leetcode 310 最小高度樹

對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...

leetcode310 最小高度樹

對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...