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实现无刷新动态调用股票信息
Nov 01 Javascript
js下获取div中的数据的原理分析
Apr 07 Javascript
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
JavaScript ParseFloat()方法
Dec 18 Javascript
Angularjs中UI Router的使用方法
May 14 Javascript
javascript内存分配原理实例分析
Apr 10 Javascript
js统计页面上每个标签的数量实例代码
May 29 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
JS原形与原型链深入详解
May 09 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 可阅读随机字符串代码
2010/05/26 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Python单元测试简单示例
2018/07/03 Python
python默认参数调用方法解析
2020/02/09 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
Python自动化测试基础必备知识点总结
2021/02/07 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
小摄影师教学反思
2014/04/27 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
共青团员自我评价范文
2014/09/14 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
文艺演出主持词
2015/07/01 职场文书
投诉信格式范文
2015/07/02 职场文书
2016年教师节慰问信
2015/12/01 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang