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 相关文章推荐
js实现的网页颜色代码表全集
Jul 17 Javascript
jquery获取html元素的绝对位置和相对位置的方法
Jun 20 Javascript
jquery实现图片上传之前预览的方法
Jul 11 Javascript
jQuery实现宽屏图片轮播实例教程
Nov 24 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
Jun 21 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
Apr 18 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
JS监听组合按键思路及实现过程
Apr 17 Javascript
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 cli 方式 在crotab中运行解决
2010/02/08 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
繁简字转换功能
2006/07/19 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
js闭包学习心得总结
2018/04/17 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
详解Python中time()方法的使用的教程
2015/05/22 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
高等教育专业自荐信范文
2014/03/26 职场文书
合伙协议书范本
2014/04/21 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
2015年科协工作总结
2015/05/19 职场文书
花木兰观后感
2015/06/10 职场文书
宣传委员竞选稿
2015/11/19 职场文书
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers