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 相关文章推荐
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
Dec 29 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
详解Bootstrap glyphicons字体图标
Jan 04 Javascript
node模块机制与异步处理详解
Mar 13 Javascript
ES6记录异步函数的执行时间详解
Aug 31 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
Mar 28 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
JavaScript实现酷炫的鼠标拖尾特效
Feb 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
wxPython中listbox用法实例详解
2015/06/01 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python中的函数作用域
2018/05/07 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
小学学校评估方案
2014/06/08 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
小学生差生评语
2014/12/29 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
Python爬虫基础初探selenium
2021/05/31 Python
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL