【图论题典】Swift 解 LeetCode 最小高度树:中心剥离法详解

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 思路来源:树的“中心剥离法”
      • 构造邻接表和度数组
      • 循环剥叶子
      • 终止条件
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

树是一种重要的数据结构,在许多应用里,我们希望选一个根,让这棵树的高度最小。LeetCode 310 就是这样一道题:给你无向树结构,选出所有可能成为“最小高度根”的节点。本文用 Swift 实现专业级解法,附上可运行代码、过程图解和复杂度分析,让你从思路到实现完全掌握。这对理解中枢化图结构、分层遍历特别有帮助,既能用于面试,也有真实网络或社交分析场景借鉴价值。

描述

题目定义:给定 n 个节点和 n–1 条无向边,它构成一棵树(连通且无环)。我们可以任选一个节点作为根,这样就有一个高度;求所有能使树高度最小的根节点。

几个入门例子:

  • n = 4, edges = [[1,0],[1,2],[1,3]],根选 1 时高度是 1,是最小的,答案 [1]
  • n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]],答案 [3,4],两者都是中心节点

这道题通过连续“剥离”叶子节点的办法,能高效找到中心节点。

题解答案

func findMinHeightTrees(_ n: Int, _ edges: [[Int]]) -> [Int] {guard n > 1 else { return [0] }var adj = Array(repeating: [Int](), count: n)var degree = Array(repeating: 0, count: n)for e in edges {adj[e[0]].append(e[1])adj[e[1]].append(e[0])degree[e[0]] += 1degree[e[1]] += 1}var leaves = [Int]()for i in 0..<n where degree[i] == 1 {leaves.append(i)}var count = nwhile count > 2 {count -= leaves.countvar newLeaves = [Int]()for leaf in leaves {for nei in adj[leaf] {degree[nei] -= 1if degree[nei] == 1 { newLeaves.append(nei) }}}leaves = newLeaves}return leaves
}

这段代码直接运行就可返回最小高度树的所有根节点,非常简洁。

题解代码分析

思路来源:树的“中心剥离法”

  1. 从树的叶子(度为 1)开始,逐层往内“剥离”节点。
  2. 每剥掉一层叶子,就把剩余节点数减去。
  3. 当剩下 ≤2 个节点时,它们就是树的中心(中点),即所求根。

这个过程类似处理拓扑排序,复杂度优雅。

构造邻接表和度数组

adj 存储邻居节点,degree 存储当前节点的度数,初始准备叶子。

循环剥叶子

每次把当前所有叶子节点剥掉,并更新它们邻居的度数;新的度为 1 的节点加入下一层叶子。

终止条件

剩余节点 ≤2 时,剥离结束。此时的 leaves 就是能成为最小高度树根的集合。

示例测试及结果

print(findMinHeightTrees(4, [[1,0],[1,2],[1,3]])) // 输出 [1]
print(findMinHeightTrees(6, [[3,0],[3,1],[3,2],[3,4],[5,4]])) // 输出 [3,4]
print(findMinHeightTrees(1, [])) // 输出 [0]
print(findMinHeightTrees(2, [[0,1]])) // 输出 [0,1]

以上示例覆盖了最小树、单节点、双节点等边界情况,验证结果都正确。

时间复杂度

  • 构造图和度数:O(n)
  • 剥离所有叶子:每个节点最多被剥一次,边最多处理一次,综合 O(n)

所以整体时间复杂度是 O(n),非常高效,适合 n ~2×10⁴ 的场景。

空间复杂度

  • 存图结构 adj: O(n)
  • 存度数数组 degree: O(n)
  • 临时叶子列表 leaves: O(n)(通常远小于 n)

总体空间复杂度是 O(n)

总结

  • 算法核心是找到树中心,通过 “多层剥叶” 思路解决,既直观又高效。

  • 使用场景

    • 在图论中求最短广播源点
    • 网络模块寻找延迟最低的通信节点
    • 社交网络中寻找信息传播中枢
  • Swift 实现简洁明快,剥离过程逻辑清晰,适合算法面试与项目落地。

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

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

相关文章

Docker的介绍与安装

​ Docker 对初学者的简单解释和应用场景 1.什么是 Docker&#xff1f; 简单来说&#xff0c;Docker 就像一个“装箱子”的工具&#xff0c;这个箱子叫做“容器”。 你写的程序和它运行需要的环境&#xff08;比如操作系统、软件、工具&#xff09;都装进一个箱子里。这个箱…

引导相机:工业自动化的智能之眼,赋能制造业高效升级

在工业自动化浪潮中&#xff0c;精准的视觉引导技术正成为生产效率跃升的关键。作为迁移科技——一家成立于2017年、专注于3D工业相机和3D视觉系统的领先供应商&#xff0c;我们深知"引导相机"的核心价值&#xff1a;它不仅是一个硬件设备&#xff0c;更是连接物理世…

智能相机如何重塑工业自动化?迁移科技3D视觉系统的场景革命

从硬件参数到产业价值&#xff0c;解码高精度视觉系统的落地逻辑 一、工业视觉的“智慧之眼” 迁移科技深耕3D工业相机领域&#xff0c;以“稳定、易用、高回报”为核心理念&#xff0c;打造覆盖硬件、算法、软件的全栈式视觉系统。成立6年累计融资数亿元的背后&#xff0c;是…

【数据挖掘】聚类算法学习—K-Means

K-Means K-Means是一种经典的无监督学习算法&#xff0c;用于将数据集划分为K个簇&#xff08;clusters&#xff09;&#xff0c;使得同一簇内的数据点相似度高&#xff0c;不同簇间的相似度低。它在数据挖掘、模式识别和机器学习中广泛应用&#xff0c;如客户细分、图像压缩和…

linux环境内存满php-fpm

检查 PHP-FPM 配置 pm.max_children&#xff1a;该参数控制 PHP-FPM 进程池中最大允许的子进程数。过高的子进程数会导致内存占用过大。你可以根据服务器的内存大小来调整 pm.start_servers&#xff1a;控制 PHP-FPM 启动时创建的进程数。根据实际情况调整此值。 pm.min_spare_…

基于CNN卷积神经网络图像识别小程序9部合集

基于CNN卷积神经网络图像识别小程序合集-视频介绍下自取 ​ 内容包括&#xff1a; 基于python深度学习的水果或其他物体识别小程序 003基于python深度学习的水果或其他物体识别小程序_哔哩哔哩_bilibili 代码使用的是python环境pytorch深度学习框架&#xff0c;代码的环境安…

WebRTC(九):JitterBuffer

JitterBuffer Jitter “Jitter”指的是连续到达的媒体包之间时间间隔的变化。在网络传输中&#xff0c;由于&#xff1a; 网络拥塞路由路径变化队列排队不同链路带宽差异 导致包之间的接收时间不一致&#xff0c;这就是网络“抖动”。 作用 **JitterBuffer&#xff08;抖…

【推荐100个unity插件】在 Unity 中绘制 3D 常春藤,模拟生长——hedera插件的使用

注意&#xff1a;考虑到后续接触的插件会越来越多&#xff0c;我将插件相关的内容单独分开&#xff0c;并全部整合放在【推荐100个unity插件】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 效果演示 文章目录 效果演示前言一、常春藤生成器工具下载二、工具使用1、…

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的几何变换前言模型变换(Model Transformation)观测变换(Viewing Transformation)视图变换(View Transformation)投影…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中&#xff0c;EXISTS、NOT EXISTS 和 IN 都是用于子查询的条件运算符&#xff0c;用于根据子查询的结果过滤主查询的行。它们之间的区别主要体现在工作方式、效率、对 NULL 值的处理以及适用场景上。 1. EXISTS 和 NOT EXISTS 作用&#xff1a; EXISTS: 检查子查询是…

GitHub 趋势日报 (2025年06月25日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 880 awesome 788 build-your-own-x 691 free-for-dev 427 best-of-ml-python 404 …

互联网大厂Java求职面试:Java虚拟线程实战

互联网大厂Java求职面试&#xff1a;Java虚拟线程实战 文章内容 开篇&#xff1a;技术总监与程序员郑薪苦的三轮对话 在一场紧张而严肃的Java工程师面试中&#xff0c;技术总监张工正对候选人郑薪苦进行深入提问。郑薪苦虽然性格幽默&#xff0c;但对技术有着扎实的理解。今天…

网络安全的两大威胁:XSS与CSRF攻击实例解析

在网络攻击中,XSS跨站脚本攻击(Cross Site Scripting)与CSRF跨站请求伪造攻击(Cross-Site Request Forgery)是两种常见的攻击方式,它们之间存在显著的区别。以下是对这两种攻击方式的详细比较: 一、攻击原理 XSS跨站脚本攻击 攻击者通过在Web页面中注入恶意脚本来实现攻…

如何一次性将 iPhone 中的联系人转移到 PC

许多重要的联系人都存储在您的 iPhone 上。为了保护关键信息&#xff0c;您可能需要将联系人从 iPhone 转移到 PC&#xff0c;这是一种有效的联系人备份方法。如果您在将 iPhone 联系人转移到电脑上遇到困难&#xff0c;现在可以从本文中学习 5 个有效的解决方案&#xff0c;然…

Spring Boot开启定时任务的三种方式 【@EnableScheduling注解,SchedulingConfigurer接口,Quartz 框架】

Spring Boot 开启定时任务的三种方式​ ​ ​ 在 Spring Boot 应用开发过程中&#xff0c;定时任务是十分常见的需求&#xff0c;比如定时清理日志文件、定期备份数据库数据、定时发送邮件提醒等。Spring Boot 提供了多种开启定时任务的方式&#xff0c;本文将详细介绍三种常见…

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? mask训练:上下文存在 ;; 自回归训练:只有上文,生成模型

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? 目录 LLM 编码器 怎么实现语义相关的 Token 向量更贴近?mask训练:上下文存在自回归训练:只有上文,生成模型一、核心机制:损失函数与反向传播的“语义校准”1. 损失函数的“语义约束”2. 嵌入层参数的“动态调整”二、关…

从OCR瓶颈到结构化理解来有效提升RAG的效果

当人们探讨如何让人工智能系统更好地从文档中查找和使用信息时&#xff0c;通常关注的是令人瞩目的算法和前沿的大型语言模型。但问题是&#xff1a;如果文本提取的质量很差&#xff0c;那么后续的努力都将付诸东流。本文探讨OCR质量如何影响检索增强生成&#xff08;RAG&#…

SpringBoot -- 整合Junit

11.SpringBoot 整合 Junit 11.1 为什么需要单元测试 由于在SpringBoot开发过程中&#xff0c;每开发一个模块&#xff0c;有时需要从 controller、service、mapper 到甚至 xml 文件的编写全部开发完毕才能进行测试&#xff0c;这是十分浪费时间的&#xff0c;比如开发人员想测…

虚拟机远程连接编译部署QT程序

概要 逻辑 我们需要凑齐 QT库、交叉编译工具、sysroot这三大件。 交叉编译的程序是部署到板卡环境运行,需要构建和板卡一样的库环境。 sysroot是我们在虚拟机上自己命名的一个文件夹,包含开发板的运行系统所需的所有文件。 虚拟机是x64版本,开发板是arm64版本。 如果开发板…

基于SpringBoot的智慧旅游系统

以智慧旅游系统的设计与实现为研究对象&#xff0c;旨在通过科技手段提升旅游业的管理效能和游客体验。在系统设计方面&#xff0c;深入分析了地理特征、丰富的文化底蕴以及多样的自然景观。结合这些独特之处&#xff0c;构建了一个多层次的旅游管理系统&#xff0c;包括景点信…