拓扑排序题目:最小高度树
文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目标题和出处标题最小高度树出处310. 最小高度树难度6 级题目描述要求树是一个无向图其中任何两个结点只通过一条路径连接。换句话说任何没有简单环路的连通图都是一个树。给定一个包含n \texttt{n}n个结点的树标记为0 \texttt{0}0到n − 1 \texttt{n} - \texttt{1}n−1以及一个包含n − 1 \texttt{n} - \texttt{1}n−1条无向边的edges \texttt{edges}edges列表其中edges[i] [a i , b i ] \texttt{edges[i] [a}_\texttt{i}\texttt{, b}_\texttt{i}\texttt{]}edges[i] [ai​, bi​]表示树中结点a i \texttt{a}_\texttt{i}ai​和b i \texttt{b}_\texttt{i}bi​之间存在一条无向边。可选择树中任何一个结点作为根。当选择结点x \texttt{x}x作为根结点时设结果树的高度为h \texttt{h}h。在所有可能的树中具有最小高度即min(h) \texttt{min(h)}min(h)的树称为最小高度树。返回所有的最小高度树的根结点标签列表。可以按任意顺序返回答案。树的高度是指根结点和叶结点之间最长向下路径中的边的数量。示例示例 1输入n 4, edges [[1,0],[1,2],[1,3]] \texttt{n 4, edges [[1,0],[1,2],[1,3]]}n 4, edges [[1,0],[1,2],[1,3]]输出[1] \texttt{[1]}[1]解释如图所示当根是标签为1 \texttt{1}1的结点时树的高度是1 \texttt{1}1这是唯一的最小高度树。示例 2输入n 6, edges [[3,0],[3,1],[3,2],[3,4],[5,4]] \texttt{n 6, edges [[3,0],[3,1],[3,2],[3,4],[5,4]]}n 6, edges [[3,0],[3,1],[3,2],[3,4],[5,4]]输出[3,4] \texttt{[3,4]}[3,4]数据范围1 ≤ n ≤ 2 × 10 4 \texttt{1} \le \texttt{n} \le \texttt{2} \times \texttt{10}^\texttt{4}1≤n≤2×104edges.length n − 1 \texttt{edges.length} \texttt{n} - \texttt{1}edges.lengthn−10 ≤ a i , b i n \texttt{0} \le \texttt{a}_\texttt{i}\texttt{, b}_\texttt{i} \texttt{n}0≤ai​, bi​na i ≠ b i \texttt{a}_\texttt{i} \ne \texttt{b}_\texttt{i}ai​bi​所有(a i , b i ) \texttt{(a}_\texttt{i}\texttt{, b}_\texttt{i}\texttt{)}(ai​, bi​)各不相同给定的输入保证是一个树并且不会有重复的边解法思路和算法这道题要求在无向树中寻找所有的最小高度树的根结点可以考虑树中的距离最远的两个结点之间的距离。如果n 1 n 1n1则图中只有一个结点树的根结点一定是0 00。以下只考虑n 1 n 1n1的情况。用d max ⁡ d_{\max}dmax​表示无向树中距离最远的两个结点之间的距离存在结点x xx和y yy的距离是d max ⁡ d_{\max}dmax​。用z zz表示从x xx到y yy的路径上的一个结点z zz可能和x xx或y yy重合将z zz到x xx和y yy的距离分别记为d x d_xdx​和d y d_ydy​则d x d y d max ⁡ d_x d_y d_{\max}dx​dy​dmax​以z zz为根结点的树的最小高度为max ⁡ ( d x , d y ) \max(d_x, d_y)max(dx​,dy​)理由如下。假设存在一个结点w ww和结点z zz的距离d w d_wdw​满足d w max ⁡ ( d x , d y ) d_w \max(d_x, d_y)dw​max(dx​,dy​)则d w d x d_w d_xdw​dx​和d w d y d_w d_ydw​dy​都大于d max ⁡ d_{\max}dmax​与无向树中距离最远的两个结点之间的距离是d max ⁡ d_{\max}dmax​矛盾。因此任意结点和结点z zz的距离都不超过max ⁡ ( d x , d y ) \max(d_x, d_y)max(dx​,dy​)以z zz为根结点的树的最小高度为max ⁡ ( d x , d y ) \max(d_x, d_y)max(dx​,dy​)。当∣ d x − d y ∣ ≤ 1 |d_x - d_y| \le 1∣dx​−dy​∣≤1时max ⁡ ( d x , d y ) ⌈ d max ⁡ 2 ⌉ \max(d_x, d_y) \Big\lceil \dfrac{d_{\max}}{2} \Big\rceilmax(dx​,dy​)⌈2dmax​​⌉此时以z zz为根结点的树的高度最小。由于同一条路径上满足∣ d x − d y ∣ ≤ 1 |d_x - d_y| \le 1∣dx​−dy​∣≤1的结点z zz有一个或两个因此对于任意无向树可以作为最小高度树的根结点的结点个数是一个或两个。为了寻找无向树中距离最远的两个结点之间的距离可以使用拓扑排序实现。由于题目中的图的表示方式是边数组为了方便处理需要首先将边数组转换成邻接结点列表的形式转换后可以在O ( 1 ) O(1)O(1)时间获得一个结点的全部相邻结点然后使用广度优先搜索遍历图。在无向图中拓扑排序时从度为1 11的结点开始使用广度优先搜索实现拓扑排序。首先将度为1 11的结点全部入队列此时队列中的结点为同一层的全部结点拓扑排序的过程中需要确保每一轮遍历的是同一层的全部结点。对于同一层的全部结点每次将一个结点出队列执行如下操作。得到该结点的所有相邻结点。对于每个相邻结点将相邻结点的出度减1 11。如果在更新出度之后相邻结点的出度变为1 11则将该相邻结点入队列。同一层的全部结点遍历结束之后队列中的结点为同一层的全部结点。上述做法可以确保每一轮遍历的是同一层的全部结点。拓扑排序的过程中每一轮都会遍历尚未遍历的最外层的全部结点。当尚未遍历的结点数不超过2 22时尚未遍历的结点是离所有最外层结点最远的结点因此尚未遍历的结点是所有的最小高度树的根结点。代码classSolution{publicListIntegerfindMinHeightTrees(intn,int[][]edges){ListIntegerrootsnewArrayListInteger();if(n1){roots.add(0);returnroots;}ListInteger[]adjacentArrnewList[n];for(inti0;in;i){adjacentArr[i]newArrayListInteger();}for(int[]edge:edges){adjacentArr[edge[0]].add(edge[1]);adjacentArr[edge[1]].add(edge[0]);}int[]degreesnewint[n];QueueIntegerqueuenewArrayDequeInteger();for(inti0;in;i){degrees[i]adjacentArr[i].size();if(degrees[i]1){queue.offer(i);}}intremainn;while(remain2){intsizequeue.size();for(inti0;isize;i){intnodequeue.poll();ListIntegeradjacentadjacentArr[node];for(intnext:adjacent){if(degrees[next]1){continue;}degrees[next]--;if(degrees[next]1){queue.offer(next);}}}remain-size;}while(!queue.isEmpty()){roots.add(queue.poll());}returnroots;}}复杂度分析时间复杂度O ( n ) O(n)O(n)其中n nn是树中的结点数。将边数组转换成邻接结点列表的形式需要O ( n ) O(n)O(n)的时间拓扑排序需要O ( n ) O(n)O(n)的时间。空间复杂度O ( n ) O(n)O(n)其中n nn是树中的结点数。邻接结点列表和队列需要O ( n ) O(n)O(n)的空间。

相关新闻

常州市shp矢量数据wgs84坐标系包含区划路网水系建筑poi等类型

常州市shp矢量数据wgs84坐标系包含区划路网水系建筑poi等类型

江苏省常州市shp矢量数据wgs84坐标系类型包含行政区划/行政名称/道路路网/交通设施/功能区/水系绿地/兴趣点/建筑轮廓等,具体内容以压缩包内为准,可用于制作各类地图,来源于网络授权下载,仅供学习研究参考,不可用于商业…

2026/7/30 17:03:39阅读更多 →
苏州简易注销失败,企业该如何走一般注销流程?

苏州简易注销失败,企业该如何走一般注销流程?

一条路走不通,换条路也得走完——注销这件事,拖越久代价越大 很多老板觉得简易注销被驳回了,干脆就不管了。但真相是:不注销的后果,比注销麻烦一百倍。法人被限制高消费、银行账户被冻结、甚至影响子女读书——这些都不…

2026/7/30 17:03:39阅读更多 →
零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南

零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南

零基础也能玩Switch游戏:Ryujinx模拟器5分钟上手指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是不是也曾经羡慕朋友手中的Switch,却又不想花几千块买一…

2026/7/30 17:01:38阅读更多 →
从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析

从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析

从源码到应用:JWTRefreshTokenBundle的架构设计与核心组件解析 【免费下载链接】JWTRefreshTokenBundle Implements a Refresh Token system over Json Web Tokens in Symfony 项目地址: https://gitcode.com/gh_mirrors/jw/JWTRefreshTokenBundle JWTRefres…

2026/7/30 18:20:15阅读更多 →
新手必看:棱镜AI工作流入门指南,教你5分钟搭建

新手必看:棱镜AI工作流入门指南,教你5分钟搭建

在日常办公和内容创作中,你是否经常遇到重复性工作消耗大量时间?从数据整理到文案撰写,从客户对接到内容发布,这些机械化的流程往往占据了我们大部分精力。现在,一种新型的智能化解决方案正在改变这一现状。一、智能化…

2026/7/30 18:20:15阅读更多 →
大模型Demo满天飞,为什么企业却不敢把Agent上线?

大模型Demo满天飞,为什么企业却不敢把Agent上线?

摘要 大模型技术的爆发让许多计算机专业的学生看到了就业的新机遇。然而,从Demo到生产环境的落地过程中,权限管理、日志记录以及可观测性成为了关键瓶颈。本文将从实际项目经验出发,探讨如何在AI时代为学生们提供切实可行的学习路线和就业建…

2026/7/30 18:20:15阅读更多 →
企业 AI 落地培训机构怎么选:跳出形式化培训,真正实现业务增效

企业 AI 落地培训机构怎么选:跳出形式化培训,真正实现业务增效

2026 年企业智能化升级迈入深水区,多份行业调研数据表明,能够搭建成熟内部 AI 人才体系的企业占比极低,七成企业做完短期 AI 培训后,工具学习无法转化为业务产出。行业现存痛点高度集中:课程脱离企业真实业务流程、缺少…

2026/7/30 18:20:15阅读更多 →
Claudia WebSocket:实时通信与消息推送的终极指南

Claudia WebSocket:实时通信与消息推送的终极指南

Claudia WebSocket:实时通信与消息推送的终极指南 【免费下载链接】opcode A powerful GUI app and Toolkit for Claude Code - Create custom agents, manage interactive Claude Code sessions, run secure background agents, and more. 项目地址: https://git…

2026/7/30 18:20:15阅读更多 →
Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案

Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案

Excel批量搜索神器:3步搞定海量Excel文件内容检索的终极解决方案 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 还在为在成百上千个Excel文件中查找特定信息而烦恼吗?QueryExc…

2026/7/30 18:18:15阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →