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 相关文章推荐
jQuery中live方法的重复绑定说明
Oct 21 Javascript
jquery 操作日期、星期、元素的追加的实现代码
Feb 07 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
js如何获取object类型里的键值
Feb 18 Javascript
jQuery的position()方法详解
Jul 19 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
Dec 09 Javascript
vue父组件向子组件(props)传递数据的方法
Jan 02 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 Javascript
详解Vue中使用插槽(slot)、聚类插槽
Apr 12 Javascript
微信小程序实现上传图片裁剪图片过程解析
Aug 22 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
文本链接逐个出现的js脚本
2007/12/12 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python 读取文件并替换字段的实例
2018/07/12 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python登录系统界面实现详解
2019/06/25 Python
python找出因数与质因数的方法
2019/07/25 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python文件编写好后如何实践
2020/07/07 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
金融专业个人求职信
2013/09/22 职场文书
七一表彰活动方案
2014/01/18 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
感谢信怎么写
2015/01/21 职场文书
如何写新闻稿
2015/07/18 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL