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变强势
Jun 22 Javascript
JavaScript之HTMLCollection接口代码
Apr 27 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
Apr 18 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
Bootstrap table使用方法总结
May 10 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
AngularJS 教程及实例代码
Oct 23 Javascript
vue项目出现页面空白的解决方案
Oct 31 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 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
ajax php 实现写入数据库
2009/09/02 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
连接Python程序与MySQL的教程
2015/04/29 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
导师就业推荐信范文
2014/05/22 职场文书
奶茶店创业计划书
2014/08/14 职场文书
婚礼父母答谢词
2015/01/04 职场文书