概述
Leetcode笔记 每日一题 310. 最小高度树 (22.04.06)
Leetcode 每日一题 310. 最小高度树 (22.04.06)
题目
树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
给你一棵包含 n
个节点的树,标记为 0 到 n - 1
。给定数字 n
和一个有 n - 1
条无向边的 edges
列表(每一个边都是一对标签),其中 edges[i] = [ai, bi]
表示树中节点 ai 和 bi 之间存在一条无向边。
可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即min(h)
)被称为 最小高度树 。
请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。
树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。
示例1:
输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。
示例2:
输入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]
输出:[3,4]
提示:
- 1 < = n < = 2 ∗ 1 0 4 1 <= n <= 2 * 10^4 1<=n<=2∗104
edges.length == n - 1
0 <= ai, bi < n
ai != bi
- 所有 (ai, bi) 互不相同
- 给定的输入 保证 是一棵树,并且不会有重复的边
解题思路
解读: 可以知道题目所求的最小高度树是指:选择树中任何一个节点作为根。当选择节点 x 作为根节点时,组成的树的高度为 h 。在所有可能的树中,树的高度最小(即
min(h)
)。比如,当n = 4 时,就可以由4个节点分别组成"四棵树",找出这"四棵树"高度最小的(min(h)
)那“一棵树”的根节点就是题目要求的值。
**思路:**题目中给定的含有 n 个节点的树,含有以下特征:
- 树是一个无向图,其中任何两个顶点只通过一条路径连接;
- 树共有 n-1条不同的边;
- 叶子节点的度为 1,非叶子节点的度至少为 2;
- 树的高度由根节点到叶子节点的最大距离决定。
根据以下图片可以知道用中心节点作为根节点的树的高度会是最小的
图源自题解:【阿飞算法】图解310. 最小高度树(拓扑排序,多写法)
所以本题实际上找中心节点,且中心点最多不超过2个
Python代码
class Solution:
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
if not edges:
return []
graph = collections.defaultdict(set)
# 构建无向图
for x, y in edges:
graph[x].append(y)
graph[y].append(x)
res = set(range(n))
while len(res) > 2:
# 寻找度为1的叶子节点
leaves = set(i for i in res if len(graph[i]) == 1)
# 删除度为1的叶子节点
res -= leaves
# 移除graph中度为1的叶子节点
for i in leaves:
for j in graph[i]:
graph[j].remove(i)
return list(res)
参考题解
- 官方题解:方法一:广度优先搜索——思路与算法具体证明所求中心节点作为根节点的树的高度会是最小的
- 参考题解:【阿飞算法】图解310. 最小高度树(拓扑排序,多写法)
最后
以上就是火星上灰狼为你收集整理的Leetcode笔记 每日一题 310. 最小高度树 (22.04.06)Leetcode笔记 每日一题 310. 最小高度树 (22.04.06)的全部内容,希望文章能够帮你解决Leetcode笔记 每日一题 310. 最小高度树 (22.04.06)Leetcode笔记 每日一题 310. 最小高度树 (22.04.06)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复