树的直径求解方法

目录

  • [1 介绍](#1 介绍)
  • [2 训练](#2 训练)

1 介绍

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

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

2 训练

题目1100318. 合并两棵树后的最小直径

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

python3代码如下,

py 复制代码
from collections import deque

class Solution:
    def minimumDiameterAfterMerge(self, edges1: List[List[int]], edges2: List[List[int]]) -> int:

        def bfs(graph, start):
            n = len(graph)
            dist = [-1] * n
            queue = deque([start])
            dist[start] = 0
            while queue:
                node = queue.popleft()
                for neighbor in graph[node]:
                    if dist[neighbor] == -1:
                        dist[neighbor] = dist[node] + 1
                        queue.append(neighbor)
            farthest_node = dist.index(max(dist))
            return farthest_node, dist

        def find_diameter_and_radius(graph):
            node1, _ = bfs(graph, 0)
            node2, dist = bfs(graph, node1)
            diameter = dist[node2]
            return diameter, dist

        n = len(edges1) + 1 
        m = len(edges2) + 1
        graph1 = [[] 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 tree
        radius1 = (diameter1 + 1) // 2
        radius2 = (diameter2 + 1) // 2
        
        # Minimum new diameter
        min_diameter = max(diameter1, diameter2, radius1 + radius2 + 1)
        
        return min_diameter
相关推荐
passer__jw7676 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾13 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序21 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒42 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法