2026/05/26

[LeetCode] 310 Minimum Height Trees

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Solution {
public:
  vector<int> findMinHeightTrees(int N, vector<vector<int>> &edges) {
    if (N == 1)
      return vector<int>({0});
    queue<int> Q;
    vector<vector<int>> G(N);
    vector<int> inDegree(N);
    for (auto &edge : edges) {
      int u = edge[0];
      int v = edge[1];
      G[u].push_back(v);
      G[v].push_back(u);
      inDegree[u]++;
      inDegree[v]++;
    }

    for (int i = 0; i < N; i++)
      if (inDegree[i] == 1)
        Q.push(i);

    int size = N;
    while (size > 2) {
      int leafSize = Q.size();
      size -= leafSize;
      for (int i = 0; i < leafSize; i++) {
        int cur = Q.front();
        Q.pop();
        for (int adj : G[cur]) {
          inDegree[adj]--;
          if (inDegree[adj] == 1)
            Q.push(adj);
        }
      }
    }

    vector<int> ans;
    while (!Q.empty()) {
      ans.push_back(Q.front());
      Q.pop();
    }
    return ans;
  }
};