Skip to content

Commit 259ba97

Browse files
committed
Create minimum-height-trees.cpp
1 parent 488d565 commit 259ba97

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

C++/minimum-height-trees.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Time: O(n)
2+
// Space: O(n)
3+
4+
class Solution {
5+
public:
6+
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
7+
if (n == 1) {
8+
return {0};
9+
}
10+
11+
unordered_map<int, unordered_set<int>> neighbors;
12+
for (const auto& e : edges) {
13+
int u, v;
14+
tie(u, v) = e;
15+
neighbors[u].emplace(v);
16+
neighbors[v].emplace(u);
17+
}
18+
19+
vector<int> pre_level, cur_level;
20+
unordered_set<int> unvisited;
21+
for (int i = 0; i < n; ++i) {
22+
if (neighbors[i].size() == 1) { // A leaf.
23+
pre_level.emplace_back(i);
24+
}
25+
unvisited.emplace(i);
26+
}
27+
28+
// A graph can have 2 MHTs at most.
29+
// BFS from the leaves until the number
30+
// of the unvisited nodes is less than 3.
31+
while (unvisited.size() > 2) {
32+
cur_level.clear();
33+
for (const auto& u : pre_level) {
34+
unvisited.erase(u);
35+
for (const auto& v : neighbors[u]) {
36+
if (unvisited.count(v)) {
37+
neighbors[v].erase(u);
38+
if (neighbors[v].size() == 1) {
39+
cur_level.emplace_back(v);
40+
}
41+
}
42+
}
43+
}
44+
swap(pre_level, cur_level);
45+
}
46+
vector<int> res(unvisited.begin(), unvisited.end());
47+
return res;
48+
}
49+
};

0 commit comments

Comments
 (0)