Java无向树分析 实现最小高度树


Posted in Javascript onApril 09, 2022

题设要求

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。

给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。

可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树 。

请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。

树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。

示例 1:

Java无向树分析 实现最小高度树

输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。

示例 2:

Java无向树分析 实现最小高度树

输入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]
输出:[3,4]

提示:
1 <= n <= 2 * 104
edges.length == n - 1
0 <= ai, bi < n
ai != bi
所有 (ai, bi) 互不相同
给定的输入保证是一棵树,并且不会有重复的边

解题思路

​  由上述两个图我们可以得出结论:题中需要求解的是树里面的中心节点,而每个树的中心节点不会超过两个。

​  而我们想要求得树里面的中心节点,我们就可以逐层FBS(也就是逐层将出度为一的叶子节点剪掉),直至剪到最后一层,就可以将结果输出了!

算法

class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> res = new ArrayList<Integer>();
        //如果只有一个节点,则它就是最小高度树
        if(n == 1){
            res.add(0);
            return res;
        }

        //每个节点的邻居数量
        int [] degree = new int[n];
        //每个节点的邻居
        HashMap<Integer,List<Integer>> map = new HashMap<>();

        for(int [] edge : edges){
            int a = edge[0];
            int b = edge[1];

            degree[a]++;
            degree[b]++;

            if(map.get(a) == null){
                map.put(a,new ArrayList<Integer>());//key:节点   value:邻居
            }

            if(map.get(b) == null){
                map.put(b,new ArrayList<Integer>());//key:节点   value:邻居
            }

            map.get(a).add(b);
            map.get(b).add(a);
        }

        //建立队列
        LinkedList<Integer> leafNodes = new LinkedList<Integer>();//表示叶子节点
        //将所有度为1的节点入队
        for(int i = 0;i < degree.length;i++){
            if(degree[i] == 1){
                leafNodes.add(i);
            }
        }

        while(leafNodes.size() > 0){
            res.clear();
            //每一层节点的数量
            int size = leafNodes.size();

            for(int i = 0;i < size;i++){
                int leaf = leafNodes.poll();
                //将当前节点加入到结果集
                res.add(leaf);

                List<Integer> neighbors = map.get(leaf);
                //将出度减一,也就是将最外层的叶子节点剪掉
                for(int neighbor : neighbors){
                    degree[neighbor]--;
                    if(degree[neighbor] == 1){
                        //叶子节点入队
                        leafNodes.add(neighbor);
                    }
                }
            }
        }
        return res;
    }
}

到此这篇关于Java实现最小高度树的文章就介绍到这了,更多相关Java 最小高度树内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Add a Formatted Table to a Word Document
Jun 15 Javascript
JavaScript window.setTimeout() 的详细用法
Nov 04 Javascript
基于jQuery的公告无限循环滚动实现代码
May 11 Javascript
JS 去除Array中的null值示例代码
Nov 20 Javascript
JavaScript 基本概念
Jan 20 Javascript
js检测用户输入密码强度
Oct 22 Javascript
AngularJS 最常用的功能汇总
Feb 17 Javascript
总结js函数相关知识点
Feb 27 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
Jun 05 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
vue如何实现关闭对话框后刷新列表
Apr 08 #Vue.js
vue实现列表垂直无缝滚动
Apr 08 #Vue.js
vue3引入highlight.js进行代码高亮的方法实例
vue中的可拖拽宽度div的实现示例
vue 实现弹窗关闭后刷新效果
Apr 08 #Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 #Vue.js
You might like
PHP个人网站架设连环讲(一)
2006/10/09 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php实现mysql封装类示例
2014/05/07 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
设定php简写功能的方法
2019/11/28 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
对python中大文件的导入与导出方法详解
2018/12/28 Python
python request 模块详细介绍
2020/11/10 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
校本教研工作方案
2014/01/14 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
超市开店计划书
2014/09/15 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
个人年终总结结尾
2015/03/06 职场文书
导游词之岳阳楼
2019/09/25 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python
浅析python中特殊文件和特殊函数
2022/02/24 Python
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏