博客
关于我
【Lintcode】1298. Minimum Height Trees
阅读量:227 次
发布时间:2019-02-28

本文共 1955 字,大约阅读时间需要 6 分钟。

如何找到使树高最小的顶点编号

在一个具有树性质的无向图中,树高是从根节点到叶子节点的最长路径的长度加一。我们的目标是找到使得树高最小的顶点编号。这个问题可以通过广度优先搜索(BFS)来解决,类似于剥洋葱的过程,从外层逐层向内剥,最后一层即为答案。

步骤解释:

  • 特殊情况处理:如果图中只有一个顶点(n=1),则树高为1,顶点编号为0。

  • 图的构建:使用邻接表表示图,并计算每个顶点的度数。邻接表通过哈希表实现,快速查找相邻顶点。

  • 初始队列填充:将度数为1的顶点入队,因为这些顶点是叶子节点,可能作为根节点时树高最小。

  • BFS层序遍历:从队列中取出当前层的所有顶点,逐层扩展,记录每一层的顶点。每处理一个顶点,检查其相邻顶点,降低其度数。如果某个顶点的度数变为1,则将其加入下一层的队列中。

  • 结果收集:当队列为空时,最后记录的顶点即为树高最小的根节点。所有属于最后一层的顶点都作为答案返回。

  • 代码实现:

    import java.util.*;public class Solution {    public List
    findMinHeightTrees(int n, int[][] edges) { List
    res = new ArrayList<>(); if (n == 1) { res.add(0); return res; } Map
    > graph = buildGraph(edges); int[] degrees = getDegrees(n, edges); Queue
    queue = new LinkedList<>(); for (int i = 0; i < n; i++) { if (degrees[i] == 1) { queue.offer(i); } } while (!queue.isEmpty()) { res.clear(); int size = queue.size(); for (int i = 0; i < size; i++) { int cur = queue.poll(); res.add(cur); for (int next : graph.get(cur)) { degrees[next]--; if (degrees[next] == 1) { queue.offer(next); } } } } return res; } private int[] getDegrees(int n, int[][] edges) { int[] degrees = new int[n]; for (int[] edge : edges) { degrees[edge[0]]++; degrees[edge[1]]++; } return degrees; } private Map
    > buildGraph(int[][] edges) { Map
    > graph = new HashMap<>(); for (int[] edge : edges) { graph.computeIfAbsent(edge[0], k -> new HashSet<>()).add(edge[1]); graph.computeIfAbsent(edge[1], k -> new HashSet<>()).add(edge[0]); } return graph; }}

    该算法的时间复杂度为O(n),空间复杂度为O(n)。通过BFS层序遍历,我们能够高效地找到使树高最小的顶点编号。

    转载地址:http://tgds.baihongyu.com/

    你可能感兴趣的文章
    opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
    查看>>
    opencv——图像缩放1(resize)
    查看>>
    opencv——最简单的视频读取
    查看>>
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
    查看>>
    OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>
    OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>