欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 树的直径求解方法

树的直径求解方法

2025/3/12 22:37:34 来源:https://blog.csdn.net/YMWM_/article/details/140078389  浏览:    关键词:树的直径求解方法

目录

  • 1 介绍
  • 2 训练

1 介绍

树的直径是指树中任意两个节点之间的最长路径长度。通常可以通过两次广度优先搜索(BFS)或深度优先搜索(DFS)来求树的直径:

  1. 第一次从任意一点出发,找到离它最远的节点 A。
  2. 第二次从节点 A 出发,找到离它最远的节点 B,A 和 B 之间的路径长度就是树的直径。

2 训练

题目1:100318. 合并两棵树后的最小直径

解题思路:分别求出两棵树的直径,然后比较大小max(d1, d2, r1 + r2 + 1)即可。

python3代码如下,

from collections import dequeclass Solution:def minimumDiameterAfterMerge(self, edges1: List[List[int]], edges2: List[List[int]]) -> int:def bfs(graph, start):n = len(graph)dist = [-1] * nqueue = deque([start])dist[start] = 0while queue:node = queue.popleft()for neighbor in graph[node]:if dist[neighbor] == -1:dist[neighbor] = dist[node] + 1queue.append(neighbor)farthest_node = dist.index(max(dist))return farthest_node, distdef find_diameter_and_radius(graph):node1, _ = bfs(graph, 0)node2, dist = bfs(graph, node1)diameter = dist[node2]return diameter, distn = len(edges1) + 1 m = len(edges2) + 1graph1 = [[] for _ in range(n)]graph2 = [[] for _ in range(m)]for u, v in edges1:graph1[u].append(v)graph1[v].append(u)for u, v in edges2:graph2[u].append(v)graph2[v].append(u)diameter1, dist1 = find_diameter_and_radius(graph1)diameter2, dist2 = find_diameter_and_radius(graph2)# Finding radius of each treeradius1 = (diameter1 + 1) // 2radius2 = (diameter2 + 1) // 2# Minimum new diametermin_diameter = max(diameter1, diameter2, radius1 + radius2 + 1)return min_diameter

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词