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 = 4edges = [[1, 0], [1, 2], [1, 3]]

        |

       / \
         

return [1]

Example 2:

Given n = 6edges = [[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;
}
};

最新文章

  1. How do I see all foreign keys to a table or column?
  2. iOS 清除web cookies
  3. 【Gym 100971K】Palindromization
  4. js:语言精髓笔记9--函数式语言特征
  5. win 7 普通家庭版 装IIS
  6. silverlight 退出当前页面、跳转到主页面
  7. java strtus2 注解配置入门(一)
  8. JavaScript String支持的辅助format函数+【分页1】
  9. 使用Raphael 画图(四) 路径(一) (javascript)
  10. BZOJ 1055 玩具取名
  11. Linq101-Aggregate
  12. Trafic
  13. bootstrap 导航栏
  14. C语言代码训练(一)
  15. Android学习笔记-TextView(文本框)(一)
  16. JavaScript new Boolean(false) 其实是true
  17. 翻煎饼 Stacks of Flapjacks
  18. ArcGIS JavaScript API4.8 底图选择的几种方案
  19. [Swift]LeetCode749. 隔离病毒 | Contain Virus
  20. Java抽象类总结规定

热门文章

  1. 第八周 yukun 20155335
  2. DotNETCore 学习笔记 MVC视图
  3. 20、redis和memcached比较?
  4. LESS使用简介!
  5. hdu 1162 Eddy&#39;s picture(最小生成树算法)
  6. perl6 修改文件并覆盖
  7. sk_buff结构
  8. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维
  9. opengl基础学习专题 (一 )编程环境搭建
  10. .NET直接编译成本地代码:.NET Native架构简介