博客
关于我
【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/

    你可能感兴趣的文章
    OPENSSH升级为7.4
    查看>>
    ViewPager切换滑动速度修改
    查看>>
    OpenSSL 引入了新的治理模式和项目,来增强社区参与和决策
    查看>>
    openssl内存分配,查看内存泄露
    查看>>
    OpenSSL创建SSL证书
    查看>>
    openssl在cygwin下编译错误:CPU不支持x86_64(CPU you selected does not support x86-64 instruction set )
    查看>>
    openssl安装
    查看>>
    openssl安装
    查看>>
    OpenSSL生成root CA及签发证书
    查看>>
    Openstack REST API
    查看>>
    OpenStack ussuri 私有云平台搭建企业级实战
    查看>>
    OpenStack 上部署 Kubernetes 方案对比
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 存储服务详解
    查看>>
    openstack 导出镜像
    查看>>
    OpenStack 搭建私有云主机实战(附OpenStack实验环境)
    查看>>
    OpenStack 综合服务详解
    查看>>
    OpenStack 网络服务Neutron详解
    查看>>
    Openstack 网络管理企业级实战
    查看>>
    OpenStack 计算服务Nova详解
    查看>>