题目:
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]
Note:
(1) According to the definition of tree on Wikipedia: “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.
思路:
刚开始觉得是一道拓扑排序的题目:每次都去掉顶点度数为1的点;最后当图中只剩下小于等于2个结点时就可以返回结果了。后来发现实现的时候用BFS最方便:首先将度数为1的顶点收集起来,然后逐个从图中将这些点删除;当然在删除的过程中,又会出现新的度数为1的顶点,所以我们需要将这些点收集起来并在下一轮中继续删除。这样迭代直到图中顶点的个数小于等于2,就可以返回结果了。
代码:
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
unordered_map<int, unordered_set<int>> hash; // build and initiate the graph using the hash table
for(auto val : edges) {
hash[val.first].insert(val.second);
hash[val.second].insert(val.first);
}
queue<int> q; // define and initialize the queue for BFS
for(int i = 0; i < n; ++i) {
if(hash[i].size() == 1)
q.push(i);
}
while(hash.size() > 2) { // Update the hash by erasing the nodes with 1 degree
queue<int> temp;
while(!q.empty()) {
int node1 = q.front();
q.pop();
int node2 = *(hash[node1].begin());
hash[node2].erase(node1);
if(hash[node2].size() == 1) {
temp.push(node2);
}
hash.erase(node1);
}
q = temp;
}
vector<int> ret; // construct the return value
for(auto val : hash) {
ret.push_back(val.first);
}
return ret;
}
};