對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。
格式該圖包含n
個節點,標記為0
到n - 1
。給定數字n
和乙個無向邊edges
列表(每乙個邊都是一對標籤)。
你可以假設沒有重複的邊會出現在edges
中。由於所有的邊都是無向邊,[0, 1]
和[1, 0]
是相同的,因此不會同時出現在edges
裡。
示例 1:
輸入:示例 2:n = 4
,edges = [[1, 0], [1, 2], [1, 3]]
0|1/ \2 3
輸出:
[1]
輸入:說明:n = 6
,edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
0 1 2\ | /3|
4|
5 輸出:
[3, 4]
解題思路:
最開始我是把每乙個點的最大深度求出來,然後將最小長度的點存進乙個容器中返回結果,但是超時了.
因為在這個過程中沒有發現其實最小高度樹的特點是根位於某條最長路徑的中點,所以其餘的點的長度計算都是多餘的。
那麼怎麼得到中間的那乙個或者兩個點呢?
通過一層一層地將邊緣的葉子節點去掉之後,最後儲存下來的乙個或者兩個點就是結果。這裡用乙個結構體,其中set用來儲存乙個節點的鄰居.當去除葉子節點時,將葉子節點從鄰居節點中刪除。
code:
class solution
};vectorfindminheighttrees(int n, vector>& edges)
;if(n==1)return ;
vectortree(n);
for(auto p:edges)
vectorcur_leafs;
vectornext_leafs;
for(int i=0;ineibors=tree[leaf].neibor;
for(auto neibor:neibors)
}if(next_leafs.empty())
cur_leafs.clear();
swap(cur_leafs,next_leafs);
}return cur_leafs;
}};
Leetcode 310 最小高度樹
對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...
leetcode 310 最小高度樹
對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...
leetcode310 最小高度樹
對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含 n 個節點,標記為 0 到 n 1。給定數字 n 和乙個無向邊 edges 列表 每乙個...