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检测图片大小的实例
Aug 21 Javascript
浅谈javascript中的instanceof和typeof
Feb 27 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
jquery验证邮箱格式是否正确实例讲解
Nov 16 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
jQuery ajax应用总结
Jun 02 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
Mar 13 Javascript
使用vue的transition完成滑动过渡的示例代码
Jun 25 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
Jun 20 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
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP缓冲区用法总结
2016/02/14 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
详解React 元素渲染
2020/07/07 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python3.5仿微软计算器程序
2020/03/30 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
护士岗位职责
2014/02/16 职场文书
职务说明书范文
2014/05/07 职场文书
社区服务活动小结
2014/07/08 职场文书
基层党员对照检查材料
2014/08/25 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang