310. Minimum Height Trees
从叶节点开始,依次删除他们,最后剩下1或者2个节点的就是树根,有点类似拓扑排序的感觉
参考:https://leetcode.com/problems/minimum-height-trees/discuss/76055/Share-some-thoughts
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
if(n==1) return {0};
vector<vector<int>> v(n);
vector<int> degree(n),leaf;
for(auto &x:edges){
v[x.first].push_back(x.second);
v[x.second].push_back(x.first);
degree[x.first]++;
degree[x.second]++;
}
for(int i=0;i<n;++i){
if(degree[i]==1) leaf.push_back(i);
}
while(n>2){
n-=leaf.size();
vector<int> newleaf;
for(int w:leaf){
for(int u:v[w]){
degree[u]--;
if(degree[u]==1)
newleaf.push_back(u);
}
}
leaf=newleaf;
}
return leaf;
}
};