Minimum Height Trees -- LeetCode
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]]
| / \
return [1]
Example 2:
Given n = 6
, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
\ | / | |
return [3, 4]
思路:找到这棵树中所有度为1的节点,它们是最外层的节点。从树中移除这些节点,重复这个操作直到树中的节点数小于3。结果可能是1个节点或者两个节点,这取决于树中最长路径的长度(奇偶性)。时间复杂度O(N)。
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
if (n == ) return vector<int>(, );
vector<unordered_set<int> > tree(n, unordered_set<int>());
for (int i = ; i < edges.size(); i++) {
tree[edges[i].first].insert(edges[i].second);
tree[edges[i].second].insert(edges[i].first);
}
vector<int> leaves;
for (int i = ; i < n; i++)
if (tree[i].size() == ) leaves.push_back(i);
while (n > ) {
vector<int> newLeaves;
for (int i = ; i < leaves.size(); i++)
for (auto j : tree[leaves[i]]) {
tree[j].erase(leaves[i]);
if (tree[j].size() == ) newLeaves.push_back(j);
}
n -= leaves.size();
leaves = newLeaves;
}
return leaves;
}
};
最新文章
- How do I see all foreign keys to a table or column?
- iOS 清除web cookies
- 【Gym 100971K】Palindromization
- js:语言精髓笔记9--函数式语言特征
- win 7 普通家庭版 装IIS
- silverlight 退出当前页面、跳转到主页面
- java strtus2 注解配置入门(一)
- JavaScript String支持的辅助format函数+【分页1】
- 使用Raphael 画图(四) 路径(一) (javascript)
- BZOJ 1055 玩具取名
- Linq101-Aggregate
- Trafic
- bootstrap 导航栏
- C语言代码训练(一)
- Android学习笔记-TextView(文本框)(一)
- JavaScript new Boolean(false) 其实是true
- 翻煎饼 Stacks of Flapjacks
- ArcGIS JavaScript API4.8 底图选择的几种方案
- [Swift]LeetCode749. 隔离病毒 | Contain Virus
- Java抽象类总结规定