`

Minimum Height Trees

阅读更多
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]

一道图的题目,我们可以每次都删除叶子节点,维护一个入度为1的队列,删除叶子节点的同时,将新的入度为0的及诶单更新到队列中,直到最后剩下一个或两个节点。代码如下:
public class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer>[] graph = new List[n];
        Queue<Integer> queue = new LinkedList<Integer>();
        List<Integer> list = new ArrayList<Integer>();
        int[] degree = new int[n];
        if(n == 1) {
            list.add(0);
            return list;
        }
        if(edges == null || edges.length == 0) return list;
        for(int i = 0; i < edges.length; i++) {
            if(graph[edges[i][0]] == null) 
                graph[edges[i][0]] = new ArrayList<Integer>();
            graph[edges[i][0]].add(edges[i][1]);
            
            if(graph[edges[i][1]] == null) 
                graph[edges[i][1]] = new ArrayList<Integer>();
            graph[edges[i][1]].add(edges[i][0]);
           
            degree[edges[i][0]] ++;
            degree[edges[i][1]] ++;
        }
        for(int i = 0; i < degree.length; i++) {
            if(degree[i] == 0) return list;
            if(degree[i] == 1) queue.offer(i);
        }
        while(!queue.isEmpty()) {
            list = new ArrayList<Integer>();
            int count = queue.size();
            for(int i = 0; i < count; i++){
                int tem = queue.poll();
                list.add(tem);
                degree[tem] --;
                for(int v : graph[tem]) {
                    if(degree[v] == 0) continue;
                    if(degree[v] == 2) queue.offer(v);
                    degree[v] --;
                }
            }
        }
        return list;
    }
}
0
2
分享到:
评论

相关推荐

    Tall Paul

    "高保罗"(Tall Paul)是一款独特的字体设计,它在视觉上以其高挑的字符形状而得名。这款字体通常被用于需要突出高度对比或创造醒目效果的设计中,比如标题、广告或海报。它的设计风格可能融合了复古与现代元素,...

    Minimum_Cut_Tree_Games

    ### 最小切割树游戏(Minimum Cut Tree Games) #### 概述 本文介绍了一种基于最小切割树问题的协作游戏,该问题也被称作多终端最大流问题。最小切割树游戏被证明是完全平衡的,并且可以在多项式时间内获得其核心...

    Minimum Spanning Trees

    在图论领域,最小生成树(Minimum Spanning Tree, MST)是一个基础且重要的概念,它在许多实际问题中有着广泛的应用,如设计网络、优化通信线路等。本文将深入探讨最小生成树的概念,并介绍两种经典的求解算法:...

    Minimum-cost Spanning Trees.docx

    在图论领域,最小生成树(Minimum-cost Spanning Tree, MCST)是一个经典的问题,其目标是在一个加权无向图中找到一棵包含所有顶点的树,使得树的所有边的权重之和尽可能小。这个问题在实际应用中有着广泛的应用,...

    leetcode卡-May-LeetCoding-Challenge:它将包含每日五月Leetcode挑战的解决方案

    而到了月中,可能就会出现更复杂的问题,比如“最小高度树”(Minimum Height Trees),这需要理解图的性质和寻找中心节点的方法。 在这个过程中,学习者不仅能提升编程技巧,还能深入理解数据结构和算法如何应用于...

    A Distributed Algorithm Minimum-Weight for Spanning Trees

    在计算机科学与通信领域,特别是针对大规模网络的设计与优化过程中,寻找一个图的最小权重生成树(Minimum-Weight Spanning Tree, MST)是一个核心问题。MST是指在一个加权的无向图中寻找一棵包含所有节点且总权重...

    Minimum Snap轨迹规划详解(1)轨迹规划入门

    Minimum Snap轨迹规划是一种常用的轨迹规划方法,主要用于机器人的运动规划。轨迹规划的目的是为了找到一条从起点到终点的平滑曲线,以便控制机器人的运动。 一、轨迹规划是什么? 轨迹规划是机器人导航的一个...

    Minimum Snap轨迹规划详解(3)闭式求解1

    《Minimum Snap轨迹规划详解(3)闭式求解1》 在轨迹规划中,Minimum Snap是一种常见的优化技术,旨在寻找一条具有最小加速度变化(snap)的路径,以实现平滑且快速的运动。本篇将详细介绍闭式求解Minimum Snap轨迹...

    POJ2516-Minimum Cost

    【标题】"POJ2516-Minimum Cost"是一个经典的计算机编程竞赛题目,源自北京大学的在线评测系统POJ(PKU Online Judge)。这个题目主要涉及到图论中的最短路径算法,要求参赛者编写程序找出从源节点到目标节点的最小...

    MinimumSpanningTree_minimumspanningtree_

    最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,特别是在计算机科学和网络设计中有着广泛应用。它指的是在一个加权无向图中找到一个边的集合,这个集合构成一棵树,连接了图中所有顶点,并且总...

    Minimum realization

    在IT领域,"Minimum realization"通常指的是在设计和优化系统时,寻找最简化的解决方案,以达到预期功能的同时,减少资源消耗、降低成本或提高效率。这个概念广泛应用于各种技术子领域,如计算机科学、电子工程、...

    Minimum Operation Performance Standards (MOPS)

    《Minimum Operation Performance Standards (MOPS)》是针对自动飞行引导和控制系统及设备的一套最低运行性能标准,由RTCA DO-325文档详细阐述。RTCA(Radio Technical Commission for Aeronautics)是一个非营利性...

    matlab开发-MinimumSpanningTree

    在IT领域,特别是软件开发和算法应用中,"Minimum Spanning Tree"(最小生成树)是一种经典的图论问题,广泛应用于网络设计、优化路径选择等多个场景。本项目以"matlab开发-MinimumSpanningTree"为主题,展示了如何...

    function minimum.rar_Function minimum

    标题"function minimum.rar_Function minimum"和描述"Finding function minimum and maximum"提示我们关注的重点是求解函数的极值。 函数的最小值和最大值通常被称为函数的极值点,它们可以是局部极值或全局极值。...

    Minimum-Redundancy Linear Array

    最小冗余阵(Minimum-Redundancy Linear Array)是一种线性阵列天线设计方法,旨在为给定数量的阵列元素实现最大分辨率的同时,减少阵列中的冗余空间间隔。此类阵列的设计思路特别适用于通信设计和射电天文学,因为...

    Direct calculation of minimum set of inertial parameters of serial robots

    关于机器人最小惯性参数集(Minimum Set of Inertial Parameters,MSIP)的概念和计算方法,是机器人动态建模和控制领域的重要内容。MSIP的概念可以帮助我们简化机器人的动态模型,从而降低动态模型的计算成本并简化...

    minimum_snap

    "minimum_snap" 是一个基于 MATLAB 的代码实现,专门用于解决这类问题。MATLAB 是一种广泛使用的数学计算软件,其强大的数值计算能力使得它成为进行这种复杂优化问题的理想工具。 在"minimum_snap"中,“snap”一词...

    ACM经典试题:最小差值对Minimum Difference Pair+编程知识+技术开发

    ACM经典试题:最小差值对Minimum Difference Pair+编程知识+技术开发; ACM经典试题:最小差值对Minimum Difference Pair+编程知识+技术开发; ACM经典试题:最小差值对Minimum Difference Pair+编程知识+技术开发;...

    机械臂设计及其定点转动Minimum-Snap轨迹规划1

    本报告主要探讨了机械臂的设计及其定点转动的Minimum-Snap轨迹规划问题。通过选取三维空间中的封闭圆形路径作为第三关节的目标轨迹,利用离散化技术生成多个轨迹点,并运用Rodriguez公式计算机械臂末端在基坐标系下...

Global site tag (gtag.js) - Google Analytics