310. 最小高度树

题目

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,任何一个没有简单环路的连通图都是一棵树。

给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。

可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树 。

请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。

树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。

示例 1:

输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。

示例 2:

输入: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) 互不相同
    • 给定的输入 保证 是一棵树,并且 不会有重复的边

    思路

            我们可以通过树的直径特性来寻找最小高度树的根节点。我们可以先找到树中两个最远节点之间的路径,通过dfs可以确定树的直径,先从任意节点出发找到最远节点x,再从x出发找到最远节点y,路径x-y就是树的直径,然后通过回溯路径找到直径的中心节点,如果直径长度为奇数,中心为中间一个节点,如果为偶数,中心为中间两个节点。

    代码

    class Solution {
    public://更新所有节点到u的距离dist和父节点parentvoid dfs(int u, vector<int> & dist, vector<int> & parent, const     vector<vector<int>> & a) {for (size_t i=0;i<a[u].size();i++){int v=a[u][i];if (dist[v]<0)//邻居v未被访问{dist[v]=dist[u]+1;//更新距离parent[v]=u;//记录父节点dfs(v,dist,parent,a);//递归访问v}}}//从节点u出发,找到距离u最远的节点,并返回该节点的编号int ll(int u,vector<int> &parent,const vector<vector<int>> &a){int n=a.size();vector<int> dist(n,-1);dist[u]=0;dfs(u,dist,parent,a);//更新距离和父节点int maxdist=0;int node=-1;for (int i=0;i<n;i++){if(dist[i]>maxdist){maxdist=dist[i];node=i;}}return node;}vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {if (n==1){return {0};}vector<vector<int>> a(n);//存每个节点的邻居for (auto &edge:edges){a[edge[0]].emplace_back(edge[1]);a[edge[1]].emplace_back(edge[0]);}vector<int> parent(n, -1);//找到距离节点0最远的节点xint x=ll(0,parent,a);//找到距离节点x最远的节点yint y=ll(x,parent,a);//找到节点x到节点y的路径vector<int> path;parent[x]=-1;while(y!=-1)//从节点y开始,沿着parent数组回溯到x,得到路径path{path.emplace_back(y);//存储的是从y到x的路径y=parent[y];}int m=path.size();if (m%2==0)//两个节点{return {path[m/2-1],path[m/2]};}else//一个节点{return {path[m/2]};}}
    };

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83022.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    Axure 纵向滚动隐藏滚动条 Axure 滑动开关(属性开关)on-off

    文章目录 I 滑动开关(属性开关)操作说明block 矩形操作说明round小圆圈操作说明on-off 属性开关组合操作说明II Axure 纵向滚动隐藏滚动条思路包含图片的动态面板1操作说明包含动态面板的顶级动态面板I 滑动开关(属性开关)操作说明 block 矩形操作说明 在画布中添加一个矩形…

    MySQL之基础事务

    目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

    VS Code 重磅更新:全新 MCP 服务器发现中心上线

    目前各种 MCP 客户端层出不穷&#xff0c;但是安装 MCP 服务却格外繁琐&#xff0c;尤其 VS Code 中无界面化的 MCP 服务配置方式&#xff0c;效率较低。 Copilot MCP 是一个 VS Code 插件&#xff0c;在今天发布的新版本中&#xff0c;插件支持了自动发现与安装开源 MCP 服务…

    智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态

    在智能家居设备出货量突破10亿台的2023年&#xff0c;家庭网关正经历着前所未有的技术革新。作为连接云端与终端设备的中枢神经&#xff0c;智能网关的存储芯片选择直接决定着整个智能生态系统的运行效率。在这场技术升级浪潮中&#xff0c;兆易创新GD25Q127CSIG串行闪存芯片主…

    R语言机器学习算法实战系列(二十五)随机森林算法多标签分组分类器及模型可解释性

    禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程内容加载必要的R包(带详细注释)1. 加载数据2. 数据分割(按Species分层抽样)3. 数据预处理配方4. 创建随机森林模型(多分类)5. 创建工作流6. 设置交叉验证和参数调优7. 参…

    速查 Linux 常用指令 II

    目录 一、网络管理命令1. 查看和配置网络设备&#xff1a;ifconfig1&#xff09;重启网络命令2&#xff09;重启网卡命令 2. 查看与设置路由&#xff1a;route3. 追踪网络路由&#xff1a;traceroute4. 查看端口信息和使用情况1&#xff09;netstat 命令2&#xff09;lsof 命令…

    关于github使用总结

    文章目录 一、本地使用git&#xff08;一&#xff09;创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 &#xff08;二&#xff09;在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…

    【Python】Python 单例模式 8 大核心应用场景深度解析(2025 新版)

    单例模式&#xff08;Singleton Pattern&#xff09;作为一种经典的设计模式&#xff0c;始终保持着重要的工程价值。 本文着重于单例模式的主要核心应用场景。 至于实现方法&#xff0c; 晚些时候发出。 一、配置管理器 全局配置信息管理是单例模式最典型的应用场景。通过单…

    计算机网络网络层(下)

    一、互联的路由选择协议&#xff08;网络层控制层面内容&#xff09; &#xff08;一&#xff09;有关路由选择协议的几个概念 1.理想的路由算法 &#xff08;1&#xff09;理想路由算法应具备的特点&#xff1a;算法必须正确和完整的&#xff0c;算法在计算上应简单&#x…

    云存储桶的“公开陷阱”|渗透测试中如何利用与防御配置错误的存储服务

    引言 云存储服务&#xff08;如AWS S3、阿里云OSS、Google Cloud Storage&#xff09;因便捷性被企业广泛使用&#xff0c;但权限配置错误却成为近年来数据泄露的重灾区。 攻击者无需复杂漏洞&#xff0c;仅需一个公开链接即可下载敏感数据。本文将深入解析这类漏洞的渗透…

    BitMart合约交易体验 BitMart滑点全赔的底层逻辑

    美国新泽西州泽西市&#xff0c;2025年5月13日 – BitMart&#xff0c;全球领先的数字资产交易平台&#xff0c;推出了其开创性的滑点保护计划&#xff0c;旨在解决加密市场中最具挑战性且常常被忽视的风险之一&#xff1a;滑点。该计划为交易者提供了在 USDT 保证金永续合约交…

    高海拔和远距离的人员识别:面部、体型和步态的融合

    大家读完就觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别&#xff08;BRIAR&#xff09;计划等监视场景中&#xff0c;其中生物识别数据是在长…

    Docker 常见问题及其解决方案

    一、安装与启动问题 1.1 安装失败 在不同操作系统上安装 Docker 时&#xff0c;可能会出现安装失败的情况。例如&#xff0c;在 Ubuntu 系统中&#xff0c;执行安装命令后提示依赖缺失。这通常是因为软件源配置不正确或系统缺少必要的依赖包。 解决方案&#xff1a; 确保系统…

    影响力最小化

    这里写目录标题 影响力最大化**创新点**参数设置 影响力最小化传播模型该文献和Budak的有什么不同呢a Linear Threshold model with One Direction state Transition (LT1DT)具体模型 影响力最大化 以INFORMS Journal on Computing为例《The Impact of Passive Social Media Vi…

    【IDEA】注释配置

    1. IDEA注释调整&#xff0c;去掉默认在第一列显示 修改为如下&#xff1a; 2. IDEA中修改代码中的注释颜色

    一文了解 HTTP Content-Type:从基础到实战

    一文了解 HTTP Content-Type&#xff1a;从基础到实战 在 Web 开发中&#xff0c;HTTP 请求头中的 Content-Type 是一个看似简单却至关重要的概念。它决定了浏览器和服务器如何解析和处理传输的数据。本文将带你全面掌握 Content-Type 的核心知识&#xff0c;涵盖常见类型、应…

    兔子队列?RabbitMQ详解(1)

    引入 首先先介绍一下什么是 RabbitMQ 的意思:Rabbit 是一个公司的名称,MQ 是 message queue (消息队列)的缩写,而 RabbitMQ 是 Rabbit 企业下的一个消息队列产品,是一个采用Erlang语言实现AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初…

    某智能家电龙头,社招 校招全面应用 AI 面试的创新实践

    某智能家电龙头在竞争中凭借创新能力和高品质服务稳居市场前列&#xff0c;为更好地赋能业务&#xff0c;集团招聘总监着力构建数字化招聘流程&#xff0c;率先引入 AI 面试实现招聘智能化升级&#xff0c;减轻 HR 负担、提升效率&#xff0c;优化候选人体验&#xff0c;达成双…

    STM32 实时时钟(RTC)详解

    一、RTC 简介 RTC&#xff08;Real Time Clock&#xff09;即实时时钟&#xff0c;本质上是一个 32 位的秒级计数器&#xff1a; 最大计数值为 4294967295 秒&#xff0c;约合 136 年&#xff1a; 复制编辑 4294967295 / 60 / 60 / 24 / 365 ≈ 136 年 RTC 初始化时&#x…

    《AI驱动的智能推荐系统:原理、应用与未来》

    一、引言 在当今信息爆炸的时代&#xff0c;用户面临着海量的信息选择&#xff0c;从购物平台上的商品推荐到流媒体服务中的影视推荐&#xff0c;智能推荐系统已经成为我们日常生活中不可或缺的一部分。AI驱动的智能推荐系统通过分析用户的行为和偏好&#xff0c;为用户提供个性…