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 相关文章推荐
ExtJS扩展 垂直tabLayout实现代码
Jun 21 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
jquery查找tr td 示例模拟
May 08 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
node.js中的console.dir方法使用说明
Dec 10 Javascript
javascript自动生成包含数字与字符的随机字符串
Feb 09 Javascript
使用vue.js制作分页组件
Jun 27 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
解决JS外部文件中文注释出现乱码问题
Jul 09 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
jquery插件实现轮播图效果
Oct 19 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
第一节--面向对象编程
2006/11/16 PHP
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
PHP速成大法
2015/01/30 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
JavaScript 乱码问题
2009/08/06 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
js获取checkbox值的方法
2015/01/28 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python黑魔法之编码转换
2016/01/25 Python
python实现用户登录系统
2016/05/21 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python面试题小结附答案实例代码
2019/04/11 Python
python实现小球弹跳效果
2019/05/10 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python实现电子书翻页小程序
2019/07/23 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
《郑和远航》教学反思
2014/04/16 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
Go语言设计模式之结构型模式
2021/06/22 Golang