310. Minimum Height Trees
来源:互联网 发布:网络教育怎么 编辑:程序博客网 时间:2024/06/15 02:08
- 题目描述
- 题意分析
- 算法分析
- 实现
- 复杂度分析
题目描述
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.
题意分析
给定一个无向图,从中选取一个节点作为根节点, 看做一棵树,返回最小高度的根节点(所有)。
算法分析
当n=1, 树高只有1, 直接返回
当n=2,选任意的一个点都是一样的, 两个点都要返回
当n>2,符合条件的节点最多只有两个. 因为假设存在三个点,说明以这三个点为root的树高度是一样的,就是到达最远叶子节点的路径长度是一样的,现在我们逐步删除叶子节点,这样三个点为root的树高度应该逐步减1,最后如果高度都减为0,说明有三个根节点也就是三棵树,这三个节点是独立的,违背了树的定义。
所以我们从叶子节点出发, 做BFS, 遍历过的叶子节点删除掉, 将新成为叶子的节点加入队列中, 直到最后删剩的节点数少于2.
实现
class Solution {public: vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) { if (n == 1) return {0}; vector< unordered_set<int> > adjMatrix(n); for (auto edge : edges) { // add edges to matrix adjMatrix[edge.first].insert(edge.second); adjMatrix[edge.second].insert(edge.first); } queue<int> leaf; for (int i = 0; i < n; i++) { if (adjMatrix[i].size() == 1) leaf.push(i); } while(n > 2) { int size = leaf.size(); n -= size; for (int i = 0; i < size; ++i) { // 要一次删去一层节点,与以往bfs的写法略有不同 int temp = leaf.front(); leaf.pop(); for (auto adjV : adjMatrix[temp]) { adjMatrix[adjV].erase(temp); if (adjMatrix[adjV].size() == 1) leaf.push(adjV); } } } vector<int> result; while (!leaf.empty()) { result.push_back(leaf.front()); leaf.pop(); } return result; }};
复杂度分析
时间复杂度
空间复杂度
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 310. Minimum Height Trees
- 在Studio中运用HttpClient时报错可能原因
- 支持多位数,括号,四则运算,的计算器算法c++实现
- 国庆假期总结
- 表管理
- 转圈的箭头
- 310. Minimum Height Trees
- 请求网络数据
- 系统服务的控制
- python IDLE自定义背景配置、字体
- C++中引用(&)的用法和应用实例-- Mr.xu
- 表查询
- bzoj4563: [Haoi2016]放棋子
- 初识JavaScript01
- 【matlab图像处理】matlab图像处理常见函数及联系