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 replace()正则替换实现代码
Feb 26 Javascript
IE6已终止操作问题的2种情况及解决
Apr 23 Javascript
Javascript中的delete操作符详细介绍
Jun 06 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
盘点javascript 正则表达式中 中括号的【坑】
Mar 16 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
javascript 判断用户有没有操作页面
Oct 17 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
Vue.js中的组件系统
May 30 Javascript
详解如何在Canvas中添加事件的方法
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数据库连接类~~做成一个分页类!
2006/11/25 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
js下弹出窗口的变通
2007/04/18 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python使用chardet判断字符编码
2015/05/09 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
python如何获取服务器硬件信息
2017/05/11 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
Python shelve模块实现解析
2019/08/28 Python
python tkinter组件使用详解
2019/09/16 Python
python列表返回重复数据的下标
2020/02/10 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
先进个人获奖感言
2014/01/24 职场文书
母亲节主题班会
2015/08/14 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书