-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
MinimumHeightTrees.cpp
98 lines (92 loc) · 2.98 KB
/
MinimumHeightTrees.cpp
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Source : https://leetcode.com/problems/minimum-height-trees/
// Author : Hao Chen
// Date : 2016-01-24
/***************************************************************************************
*
* For a undirected graph with tree characteristics, we can choose any node as the
* root. The result graph is then a rooted tree. Among all possible rooted trees, those
* with minimum height are called minimum height trees (MHTs).
*
* Given such a graph, write a function to find all the MHTs and return a list of
* their root labels.
*
* *Format*
* The graph contains n nodes which are labeled from 0 to n - 1.
* You will be given the number n and a list of undirected edges (each edge is a
* pair of labels).
*
*
* You can assume that no duplicate edges will appear in edges. Since all edges are
* undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
*
* Example 1:
*
* Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]
*
* 0
* |
* 1
* / \
* 2 3
*
* return [1]
*
* Example 2:
*
* Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
*
* 0 1 2
* \ | /
* 3
* |
* 4
* |
* 5
*
* return [3, 4]
*
* How many MHTs can a graph have at most?
*
* Note:
*
* (1) According to the definition of tree on Wikipedia: https://en.wikipedia.org/wiki/Tree_(graph_theory)
* “a tree is an undirected graph in which any two vertices are connected by exactly one path.
* In other words, any connected graph without simple cycles is a tree.”
*
* (2) The height of a rooted tree is the number of edges on the longest downward path between
* the root and a leaf.
*
* Credits:Special thanks to @dietpepsi for adding this problem and creating all test
* cases.
***************************************************************************************/
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
//corner case
if ( n <= 1 ) return {0};
//construct a edges search data stucture
vector<unordered_set<int>> graph(n);
for (auto e : edges) {
graph[e.first].insert(e.second);
graph[e.second].insert(e.first);
}
//find all of leaf nodes
vector<int> current;
for (int i=0; i<graph.size(); i++){
if (graph[i].size() == 1) current.push_back(i);
}
// BFS the graph
while (true) {
vector<int> next;
for (int node : current) {
for (int neighbor : graph[node]) {
graph[neighbor].erase(node);
if (graph[neighbor].size() == 1) next.push_back(neighbor);
}
}
if (next.empty()) break;
current = next;
}
return current;
}
};