树的直径:概念、算法与应用详解
📅 2026/7/28 20:41:39
👁️ 次浏览
1. 什么是树的直径在树形数据结构中树的直径Tree Diameter定义为树中任意两个节点之间的最长路径长度。这条最长路径可能经过根节点也可能不经过。直径的长度通常用路径上的边数无权图或边的权重之和带权图来衡量。例如对于一棵有 n 个节点的树其直径的取值范围是 [1, n-1]。当树退化成一条链时直径达到最大值 n-1当树为星形结构一个中心节点连接所有其他节点时直径最小为 2。2. 求解树的直径的经典算法2.1 两次 DFS/BFS 法最常用这是求解无权树直径最经典、最高效的算法时间复杂度为 O(n)只需两次遍历从任意节点通常选节点 1出发进行 DFS 或 BFS找到距离最远的节点 u。从节点 u 出发再次进行 DFS 或 BFS找到距离 u 最远的节点 v。节点 u 和 v 之间的路径就是树的一条直径其长度即为直径值。算法正确性证明第一次遍历找到的 u 一定是某条直径的端点。第二次遍历从 u 出发找到的 v 就是直径的另一个端点。2.2 树形 DP 法通过一次 DFS 同时计算每个节点的“向下最长路径”和“次长路径”动态维护直径// C 示例代码 #include iostream #include vector #include algorithm using namespace std; vectorvectorint adj; int diameter 0; int dfs(int u, int parent) { int max1 0, max2 0; // 最长和次长向下路径 for (int v : adj[u]) { if (v parent) continue; int depth dfs(v, u) 1; if (depth max1) { max2 max1; max1 depth; } else if (depth max2) { max2 depth; } } diameter max(diameter, max1 max2); return max1; } int main() { int n 7; adj.resize(n 1); // 构建树: 1-2, 1-3, 2-4, 2-5, 3-6, 3-7 adj[1].push_back(2); adj[2].push_back(1); adj[1].push_back(3); adj[3].push_back(1); adj[2].push_back(4); adj[4].push_back(2); adj[2].push_back(5); adj[5].push_back(2); adj[3].push_back(6); adj[6].push_back(3); adj[3].push_back(7); adj[7].push_back(3); dfs(1, 0); cout lt;lt; 树的直径: lt;lt; diameter lt;lt; endl; // 输出 4 return 0; }3. 带权树的直径当树的边带有权重时直径定义为路径上所有边权重之和的最大值。求解方法同样可以使用两次 DFS/BFS 或树形 DP只需在计算距离时累加权重即可。# Python 示例带权树的直径两次DFS from collections import defaultdict def dfs(start, n, graph): 返回 (最远节点, 最大距离) stack [(start, -1, 0)] # (当前节点, 父节点, 累计距离) max_dist 0 farthest start while stack: u, parent, dist stack.pop() if dist max_dist: max_dist dist farthest u for v, w in graph[u]: if v ! parent: stack.append((v, u, dist w)) return farthest, max_dist def tree_diameter_weighted(n, edges): n个节点edges: [(u, v, w), ...] graph defaultdict(list) for u, v, w in edges: graph[u].append((v, w)) graph[v].append((u, w)) # 第一次DFS endpoint1, _ dfs(1, n, graph) # 第二次DFS endpoint2, diameter dfs(endpoint1, n, graph) return diameter, endpoint1, endpoint2 示例带权树 n 5 edges [(1, 2, 3), (2, 3, 5), (2, 4, 1), (1, 5, 2)] diameter, u, v tree_diameter_weighted(n, edges) print(f直径端点: {u} 和 {v}, 直径长度: {diameter}) # 输出 84. 直径的性质与应用4.1 重要性质直径不一定唯一一棵树可能有多个直径但它们的长度相同。所有直径相交于中心树的所有直径都经过树的中心一个节点或一条边。直径的端点一定是叶子节点度数为 1 的节点。树的中心直径的中点称为树的中心可用于优化树上的操作。4.2 实际应用场景网络设计在通信网络中树的直径反映了最坏情况下的传输延迟。社交网络分析树形结构的组织或传播网络中直径表示信息传播的最长路径。算法竞赛许多树形 DP 问题需要计算直径或利用直径性质优化。数据结构优化以树的中心为根重建树可以使树的高度最小化优化查询效率。5. 常见变体与扩展5.1 动态树的直径支持添加/删除边操作动态维护树的直径。可以使用 LCTLink-Cut Tree或树的直径性质结合并查集解决。5.2 所有直径端点找出树的所有直径端点。可以通过两次 DFS 找到一条直径后检查其他叶子节点是否也能构成相同长度的路径。5.3 直径上的节点给定一棵树快速判断某个节点是否在直径上。可以通过计算该节点到两个直径端点的距离之和是否等于直径长度来判断。6. 总结树的直径是树形结构中的一个基础且重要的概念。掌握两次 DFS/BFS 和树形 DP 这两种求解方法理解直径的性质能够帮助解决许多树相关的算法问题。在实际应用中根据是否需要处理带权边、动态修改等需求选择合适的算法变体。
1. 项目概述:两阶段P2G系统建模的核心逻辑 P2G(Power-to-Gas)技术正在成为能源转型的关键枢纽,它实现了电能到氢能再到甲烷的阶梯式转化。这个Matlab建模项目聚焦两个核心化学反应阶段:第一阶段通过电解水制取高纯度氢…
📅 2026/7/28 20:40:39
1. 理工写作的本质困境实验室里刚做完一组数据测试,你盯着屏幕上跳动的数字,突然意识到又到了写论文的时候。打开空白文档,手指悬在键盘上方却迟迟敲不下去——这场景对理工科研人员来说太熟悉了。我们总在实验台前游刃有余,却在文…
📅 2026/7/28 20:40:39
很多朋友想学 Python,但面对海量教程和复杂环境配置,往往还没开始就放弃了。传统的学习路径需要自己安装环境、配置 IDE、手动调试,一个简单的语法错误可能就要卡半天。现在,借助 AI 编程助手,学习 Python 的门槛被大幅降低。你可以像拥有一个随时在线的编程导师,它能帮你…
📅 2026/7/28 20:40:39
安装步骤直接看红字python官网下载太慢了,于是把所有版本都下载下来。3.5、3.6、3.7、3.8、3.9、3.10、3.11、3.12等全部打包到一起,。这下子总没问题了吧。初学者只需下载一个python版本,一个编辑器。总共两个即可。📦 网盘链接&…
📅 2026/7/29 17:25:03
更多请点击:
https://intelliparadigm.com
第一章:AI产量预测不是算法问题,而是这5个跨部门协作断点导致的(附SOP对接模板) AI模型在产线部署后预测准确率骤降,87%的案例根源并非特征工程或模型调参失误&…
📅 2026/7/29 17:25:03
测试 方案 序号 功能模块 测试项 结果(Pass/Fals) 测试用例 1 Http接口 患者信息查询 PASS 2 Http接口 患者信息新增 PASS 3 Http接口 患者信息更新 PASS 4 Http接口 患者信息删除 PASS 项目 功能测试 测试项 服务定义与调用 序号 版本…
📅 2026/7/29 17:25:03
FIFO原理
1.概念
FIFO是“先进先出”(First In First Out)的缩写,在FIFO队列中,先进入队列的数据项也会先被取出,即最先进入队列的元素先出队列,最后进入队列的元素最后出队列。
2.使用细节 FIFO 和 RAM 的共同点在于都能存储数据、都有控制写和读的信号;不同点在 于…
📅 2026/7/29 17:25:03
目录
购机
主板
CPU
内存
显卡
判断显卡好坏的步骤
新买的显卡安装后显示器不亮
电源
其他故障
双系统开机故障
windows故障
网络问题
接口问题 购机
1. 选购台式机配件要看清楚型号和规格是否匹配,比如主板和 CPU 槽位的搭配,内存和主板频…
📅 2026/7/29 17:25:03
做SEO的兄弟们,最近是不是又被“geo2”这个词搞得头大?网上那些教程写得花里胡哨,什么高大上的算法模型,其实剥开那层皮,核心就那点事儿。今天我不整那些虚头巴脑的理论,就结合我最近帮客户做站的实际操作,聊聊geo2的结构到底该怎么搞,顺便把那些割韭菜的坑给你指出来。…
📅 2026/7/29 17:23:43
解密Seq的核心功能:如何利用Pipeline实现高效基因组数据处理 【免费下载链接】seq A high-performance, Pythonic language for bioinformatics 项目地址: https://gitcode.com/gh_mirrors/se/seq
Seq作为一款高性能的生物信息学专用语言,其Pipel…
📅 2026/7/29 0:00:00
Flask-Blogging插件开发指南:打造属于你的个性化博客功能 【免费下载链接】Flask-Blogging A Markdown Based Python Blog Engine as a Flask Extension. 项目地址: https://gitcode.com/gh_mirrors/fl/Flask-Blogging
Flask-Blogging是一个基于Markdown的Py…
📅 2026/7/29 0:00:00
近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…
📅 2026/7/29 0:01:00
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/29 1:14:44
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/29 1:14:44
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/29 1:14:46
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/29 7:15:11
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/29 17:15:46
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/29 5:15:05