这个题是一个看着就没法做的题,但是用拓扑排序(bfs)可以很好的解决。
如果直接从题目角度考虑,每个当根做一遍dfs,那百分百超时的。
此题的做法是比较难想的,就是从外层节点往里走,走到最中心就是了。具体做法和拓扑排序很相似:记录度数组,每次取出度为1的节点,最后一批度为1的节点就是我们要找的根。
class Solution {
typedef pair<int, int> P;
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
if(n == 1)return vector<int>{0};
queue<P> q;
map<int, vector<int>> adj;
vector<int> degree(n);
for(auto e: edges)
{
adj[e[0]].push_back(e[1]);
adj[e[1]].push_back(e[0]);
degree[e[0]]++;
degree[e[1]]++;
}
for(int i=0;i<n;i++)
if(degree[i] == 1)q.push(P(i, 1));
vector<int> ans;
int ct = 1;
while(q.size()>0)
{
P p = q.front(); q.pop();
int node = p.first, layer = p.second;
if(layer > ct)ans.clear(), ct = layer;
ans.push_back(node);
auto neib = adj[node];
for(auto i: neib)
{
degree[i]--;
if(degree[i] == 1)q.push(P(i, layer+1));
}
}
return ans;
}
};