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 相关文章推荐
javascript 中对象的继承〔转贴〕
Jan 22 Javascript
Javascript中eval函数的使用方法与示例
Apr 09 Javascript
关于JavaScript中var声明变量作用域的推断
Dec 16 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
文件上传,iframe跨域数据提交的实现
Nov 18 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
Dec 05 Javascript
react native带索引的城市列表组件的实例代码
Aug 08 Javascript
简单实现jQuery弹窗效果
Oct 30 jQuery
Nuxt.js实战详解
Jan 18 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
Nov 26 Javascript
微信小程序实现录音时的麦克风动画效果实例
May 18 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
深入了解php4(2)--重访过去
2006/10/09 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
Django中URLconf和include()的协同工作方法
2015/07/20 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
Django实现文件上传和下载功能
2019/10/06 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
卫校毕业生自我鉴定
2013/10/31 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
九年级数学教学反思
2014/02/02 职场文书
新任教师自我鉴定
2014/02/24 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
愚人节活动策划方案
2014/03/11 职场文书
社区党务公开实施方案
2014/03/18 职场文书
批评与自我批评总结
2014/10/17 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
寻找成龙观后感
2015/06/12 职场文书