樹是乙個無向圖,其中任何兩個頂點只通過一條路徑連線。 換句話說,乙個任何沒有簡單環路的連通圖都是一棵樹。
給你一棵包含 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]]示例 2:輸出:[1]
解釋:如圖所示,當根是標籤為 1 的節點時,樹的高度是 1 ,這是唯一的最小高度樹。
輸入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]方法一:bfs輸出:[3,4]
統計各節點的度,然後把所有出度為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 列表 每乙個...