310. 最小高度树

方法:拓扑排序
class Solution:
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
if n == 1:
return [0]
g = [[] for _ in range(n)]
deg = [0] * n
for u, v in edges:
g[u].append(v)
g[v].append(u)
deg[u] += 1
deg[v] += 1
q = [i for i, d in enumerate(deg) if d == 1]
remainModes = n
while remainModes > 2:
remainModes -= len(q)
nxt = []
for u in q:
for v in g[u]:
deg[v] -= 1
if deg[v] == 1:
nxt.append(v)
q = nxt
return q

class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
if (n == 1) return {0};
vector<int> deg(n);
vector<vector<int>> adj(n);
for (auto & edge : edges){
adj[edge[0]].emplace_back(edge[1]);
adj[edge[1]].emplace_back(edge[0]);
++deg[edge[0]];
++deg[edge[1]];
}
vector<int> q;
for (int i = 0; i < n; ++i){
if (deg[i] == 1){
q.emplace_back(i);
}
}
int remainNodes = n;
while (remainNodes > 2){
remainNodes -= q.size();
vector<int> nxt;
for (auto & u : q){
for (auto & v : adj[u]){
if (--deg[v] == 1){
nxt.emplace_back(v);
}
}
}
q = move(nxt);
}
return q;
}
};