拓扑排序题目:最小高度树

发布时间:2026/11/12 11:54:28

拓扑排序题目:最小高度树 文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目标题和出处标题最小高度树出处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)的空间。
延伸阅读

更多相关文章

2026/11/11 19:19:26

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

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

2026/11/12 11:50:51

安徽泾县考电工证费用官方回应:急需特种作业证才能上岗找工作

安徽泾县考电工证费用官方回应:急需特种作业证才能上岗找工作 你是不是正为找工作发愁?手里没有 特种作业操作证 ,连面试机会都可能被拦在门外。别急,今天我们就来聊聊 安徽泾县考电工证费用 ,并结合 官方回应 ,帮你理清思路,少走弯路。…

2026/11/12 11:50:50

电工作业免责声明怎么考?真实经历告诉你外省证怎么转过来

电工作业免责声明怎么考?真实经历告诉你外省证怎么转过来 之前考的证在外省能不能转过来?这几乎是每个电工作业从业者遇到的第一个问题,尤其是那些在外省工作多年、突然想回老家发展的朋友。我之前也遇到过这种情况,当时手里的高压电工证是山东的,想回河…

2026/11/12 11:50:50

孝昌电工证怎么复审 怎么报名最靠谱

孝昌电工证怎么复审 怎么报名最靠谱 不知道去哪报名怕被中介坑?别急,本文从实操角度给你讲清楚孝昌电工证怎么复审、怎么报名,避坑指南全在这了,别再被套路。 一、孝昌电工证怎么复审?全流程不走弯路…

2026/11/12 11:50:50

南安水电工证全国通用怎么考?找工作必备技能证书指南

南安水电工证全国通用怎么考?找工作必备技能证书指南 你缺一张能让你 马上上岗 的特种作业证吗?别急,南安水电工证全国通用,是从事水电安装、维修、施工等岗位的“通行证”。现在考下它,不仅能让你顺利进工地,还能让你在同行中多一份竞争力。但很多人…

2026/11/12 11:50:50

老牌的高压电工证考试官方回应:实操考试心里没底怕挂科怎么办

老牌的高压电工证考试官方回应:实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科,特别是第一次报考高压电工证的小伙伴,这种焦虑谁懂啊?一想到要操作高压设备,心里就发怵。但你不是一个人在战斗,官方回应来了, 老牌的高压电工证考试…

2026/11/12 11:45:49

电工证如何分等级全国通用合格标准与通过率全解析

电工证如何分等级全国通用合格标准与通过率全解析 怕考不过白交培训费?你不是一个人。电工证是特种作业操作证中需求量最大的一种,全国通用,但很多学员最担心的就是考试不通过,培训费打水漂。别急,本文从洛阳涧西区劳务班组负责人的角度出发,详细讲讲电…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑