求给定图中,能形成树的最矮的树。
BFS,利用无向图每个点的degree来计算。先计算每个点的degree,然后将degree为1的点放入list或者queue中进行计算,把这些点从邻接表中去除,然后计算接下来degree = 1的点。最后剩下1 - 2个点就是新的root。
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
vector<unordered_set<int>> graph(n);
for(auto a : edges)
{
graph[a.second].insert(a.first);
graph[a.first].insert(a.second);
}
vector<int> temp;
if (n == 1) {
temp.push_back(0);
return temp;
}
for(int i = 0; i < n; ++i){
if(graph[i].size() == 1)
temp.push_back(i);
}
while(true)
{
vector<int> next;
for(auto a : temp){
for(auto neighbor : graph[a])
{
graph[neighbor].erase(a);
if(graph[neighbor].size() == 1)
next.push_back(neighbor);
}
}
if(next.size() == 0)
return temp;
else
temp = next;
}
}
};