leetcode 310 最小高度樹

2021-10-15 00:17:10 字數 2038 閱讀 7540

樹是乙個無向圖,其中任何兩個頂點只通過一條路徑連線。 換句話說,乙個任何沒有簡單環路的連通圖都是一棵樹。

給你一棵包含 n 個節點的數,標記為 0 到 n - 1 。給定數字 n 和乙個有 n - 1 條無向邊的 edges 列表(每乙個邊都是一對標籤),其中 edges[i] = [ai, bi] 表示樹中節點 ai 和 bi 之間存在一條無向邊。

可選擇樹中任何乙個節點作為根。當選擇節點 x 作為根節點時,設結果樹的高度為 h 。在所有可能的樹中,具有最小高度的樹(即,min(h))被稱為 最小高度樹 。

請你找到所有的 最小高度樹 並按 任意順序 返回它們的根節點標籤列表。

樹的 高度 是指根節點和葉子節點之間最長向下路徑上邊的數量。

leetcode 310. 最小高度樹

示例 1:

輸入:n = 4, edges = [[1,0],[1,2],[1,3]]

輸出:[1]

解釋:如圖所示,當根是標籤為 1 的節點時,樹的高度是 1 ,這是唯一的最小高度樹。

示例 2:

輸入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]

輸出:[3,4]

方法一:bfs

統計各節點的度,然後把所有出度為1的節點進佇列,即先將葉子結點入佇列,然後不斷地bfs,最後找到的就是由兩邊的葉子結點同時向中間靠近的節點,那麼這個中間節點就相當於把整個樹的最大直徑平分了。

class

solution

queue<

int> qu;

//將入度為1的葉子結點入隊

for(

int i=

0; i

//特殊情況處理

if(n ==

1) res.

push_back(0

);//從外向內一層一層剝,每次加入的都是樹的一層葉子,

//最後一層即為最終結果

while

(!qu.

empty()

)}}}

return res;}}

;

class

solution

//第一次從0開始搜尋,所以將0到0的距離置為1,以0為原點

//用兩點之間節點的數量表示兩點的距離

range[0]

=1;int a =

dfs(

0, range)

;//重置range的每一項為0

fill

(range.

begin()

, range.

end(),

0);//第二次從a開始

range[a]=1

;//此時,range是以a為原點,各個點距離a點的距離陣列

int b =

dfs(a, range)

; help.

push_back

(b);

//令a不動,b逐漸向a靠近

while

(a != b)}}

vector<

int> res;

int mid;

//輔助陣列的size是2的倍數,中間點有兩個

if(help.

size()

%2==0

)else

return res;

}//深度搜尋以v為根節點的樹,距離v點最遠的點

intdfs

(int v, vector<

int>

& range)}}

return max;}}

;

Leetcode 310 最小高度樹

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

leetcode 310 最小高度樹

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

leetcode310 最小高度樹

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