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中的私有/静态属性介绍
Jul 26 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
Jan 14 Javascript
动态加载js、css的实例代码
May 26 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 Javascript
一个简易的js图片轮播效果
Jul 22 Javascript
微信小程序滚动Tab实现左右可滑动切换
Aug 17 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 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垃圾回收机制简单说明
2010/07/22 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php微信公众号开发模式详解
2016/11/28 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
十个Python程序员易犯的错误
2015/12/15 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
行政部总经理岗位职责
2014/01/04 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
小学中等生评语
2014/12/29 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
中考学习决心书
2015/02/04 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
解析MySQL索引的作用
2022/03/03 MySQL
PyTorch中的torch.cat简单介绍
2022/03/17 Python