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注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 Javascript
JS实现的集合去重,交集,并集,差集功能示例
Mar 13 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
webpack4打包vue前端多页面项目
Sep 17 Javascript
javascript实现雪花飘落效果
Aug 19 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP 正则表达式小结
2015/02/12 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
JS命名空间的另一种实现
2013/08/09 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
全面了解Python环境配置及项目建立
2016/06/30 Python
python从子线程中获得返回值的方法
2019/01/30 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
Python pip 常用命令汇总
2020/10/19 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
中专生毕业自我鉴定
2013/11/01 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
作风年建设汇报材料
2014/08/14 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
女方离婚起诉书
2015/05/18 职场文书
Nginx实现会话保持的两种方式
2022/03/18 Servers
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android