拓扑排序题目:最小高度树
文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目标题和出处标题最小高度树出处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/10/15 3:41:56 阅读更多 →
新大陆物联网Android开发实战(一)通过接入API文档获取新大陆物联网官网Logo-GETPOST多线程实战-网络资源下载

新大陆物联网Android开发实战(一)通过接入API文档获取新大陆物联网官网Logo-GETPOST多线程实战-网络资源下载

目录 一、背景 二、思路与实施 权限配置: 布局设计: 布局代码: 接口类实现代码: DownLoad类代码: 三、文章总结 四、源码下载 一、背景 本文章是针对新大陆物联网竞赛,其中Android开发的相关知识的总结…

2026/9/28 4:03:36 阅读更多 →
如何选择最适合你的编程字体:Maple Mono完整指南

如何选择最适合你的编程字体:Maple Mono完整指南

如何选择最适合你的编程字体:Maple Mono完整指南 【免费下载链接】maple-font Maple Mono: Open source monospace font with round corner, ligatures and Nerd-Font icons for IDE and terminal, fine-grained customization options. 带连字和控制台图标的圆角等…

2026/10/4 15:08:30 阅读更多 →

最新新闻

刻蚀设备PM后首件:为什么总是不稳定

刻蚀设备PM后首件:为什么总是不稳定

一、痛点背景:从一次真实的生产事故说起刻蚀设备PM后首件:为什么总是不稳定这个问题,在FAB里不是一天两天了。我见过太多工程师踩坑:要么是方法用错导致数据误判,要么是工具选型失误导致项目延期,要么是流程…

2026/10/17 6:33:58 阅读更多 →
工程师副业的边界:竞业与合规红线

工程师副业的边界:竞业与合规红线

一、痛点背景:从一次真实的生产事故说起工程师副业的边界:竞业与合规红线这个问题,在FAB里不是一天两天了。我见过太多工程师踩坑:要么是方法用错导致数据误判,要么是工具选型失误导致项目延期,要么是流程设…

2026/10/17 6:33:58 阅读更多 →
从专利数据到流程创新占比:1988-2025年上市公司指标构建全解

从专利数据到流程创新占比:1988-2025年上市公司指标构建全解

做创新经济学实证研究的人,看到“1988-2025年上市公司流程创新占比数据”这个项目名,第一反应通常不是“数据在哪”,而是一连串概念问题:流程创新到底怎么界定?占比的分母是专利总数、研发支出还是别的?198…

2026/10/17 6:33:58 阅读更多 →
小程序更新维护实战:从公告撰写到问题排查的完整复盘

小程序更新维护实战:从公告撰写到问题排查的完整复盘

1. 公告背后的背景与核心需求解析做小程序维护的人应该都有这种体会:真正让人紧张的往往不是新功能上线,而是老版本用户向你涌来的那一波反馈。前段时间我社就经历了一轮这样的考验——针对早期发布的小程序做了一次集中更新,同时处理了一批积…

2026/10/17 6:33:57 阅读更多 →
EdrawMax 6.8 绿色便携版:临时画图场景的免安装制图方案

EdrawMax 6.8 绿色便携版:临时画图场景的免安装制图方案

简介:亿图图示(EdrawMax)6.8中文绿色便携版是一份免安装、可直接运行的图形设计工具,面向需要快速绘制专业图表的职场人士、学生及自由创作者,适用于工作汇报、学术研究、灵感记录等场景。压缩包约48.81MB,…

2026/10/17 6:33:57 阅读更多 →
Claude Code 模板库实战:从提示词到可复用工程资产

Claude Code 模板库实战:从提示词到可复用工程资产

最近这段时间,Claude Code 在开发圈里的讨论热度一直没降。很多人用完第一反应是“这玩意儿确实能干活”,可真到上手的时候,又会觉得它不稳定、答非所问、改错文件。我观察到一个很关键的分水岭:那些用得顺的人,几乎都…

2026/10/17 6:32:57 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →