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 相关文章推荐
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
js轮播图代码分享
Jul 14 Javascript
Bootstrap实现提示框和弹出框效果
Jan 11 Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 Javascript
在vue中使用jointjs的方法
Mar 24 Javascript
浅析Vue 防抖与节流的使用
Nov 14 Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 Javascript
微信小程序收藏功能的实现代码
Jun 19 Javascript
JS原生实现轮播图的几种方法
Mar 23 Javascript
vue选项卡切换的实现案例
Apr 11 Vue.js
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下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
英文留学推荐信范文
2014/01/25 职场文书
小学生评语大全
2014/04/18 职场文书
酒店员工培训方案
2014/06/02 职场文书
走进敬老院活动总结
2014/07/10 职场文书
小学教师年度个人总结
2015/02/05 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python