5098. 树的直径

给你这棵「无向树」,请你测算并返回它的「直径」:这棵树上最长简单路径的 边数。

我们用一个由所有「边」组成的数组 edges 来表示一棵无向树,其中 edges[i] = [u, v] 表示节点 u 和 v 之间的双向边。

树上的节点都已经用 {0, 1, ..., edges.length} 中的数做了标记,每个节点上的标记都是独一无二的。

 

示例 1:

输入:edges = [[0,1],[0,2]]
输出:2
解释:
这棵树上最长的路径是 1 - 0 - 2,边数为 2。
示例 2:

输入:edges = [[0,1],[1,2],[2,3],[1,4],[4,5]]
输出:4
解释: 
这棵树上最长的路径是 3 - 2 - 1 - 4 - 5,边数为 4。
 

提示:

0 <= edges.length < 10^4
edges[i][0] != edges[i][1]
0 <= edges[i][j] <= edges.length
edges 会形成一棵无向树

题解:

class Solution:
    def treeDiameter(self, edges: List[List[int]]) -> int:
        d = collections.defaultdict(list)
        for i, j in edges:
            d[i] += [j]
            d[j] += [i]
        for i in d:
            if len(d[i]) == 1:
                start = i
                break
        ans = 0
        def f(i, p, h):
            nonlocal ans, start
            if len(d[i]) == 1 and h > ans:
                ans, start = h, i
                return
            for c in d[i]:
                if c != p:
                    f(c, i, h + 1)
        f(d[start][0], start, 1)
        f(d[start][0], start, 1)
        return ans

 

### 直径定义及计算方法 #### 定义 直径是指中距离最远的两个节点之间的路径长度。这里的路径长度指的是连接这两个节点之间经过的边的数量[^1]。 #### 计算方法 一种常见的求解直径的方法是基于两次广度优先搜索(BFS)或者深度优先搜索(DFS)。具体过程如下: 1. **第一次遍历**:从任意一个节点出发,找到离这个节点最远的一个节点 \( u \)。 2. **第二次遍历**:以节点 \( u \) 作为起点再次进行遍历,找到离 \( u \) 最远的另一个节点 \( v \),此时 \( u \) 到 \( v \) 的路径即为直径。 这种方法的时间复杂度为 \( O(n) \),其中 \( n \) 是中的节点数,因为每一步都只需要一次完整的图遍历操作。 以下是实现此算法的一种 Python 实现方式: ```python from collections import deque def bfs(graph, start): queue = deque([(start, 0)]) visited = set() farthest_node = None max_distance = 0 while queue: node, distance = queue.popleft() if node not in visited: visited.add(node) if distance > max_distance: max_distance = distance farthest_node = node for neighbor in graph[node]: if neighbor not in visited: queue.append((neighbor, distance + 1)) return farthest_node, max_distance def tree_diameter(graph): # First BFS to find a farthest node from an arbitrary starting point. first_farthest, _ = bfs(graph, list(graph.keys())[0]) # Second BFS to find the actual diameter of the tree. _, diameter = bfs(graph, first_farthest) return diameter ``` 以上代码展示了如何通过两次 BFS 来计算直径。`graph` 参数是一个邻接表表示的无向连通图。 #### 进阶概念 对于更复杂的场景,比如动态更新结构或处理带权边的情况,则可能需要用到高级的数据结构和技术,例如形 DP 或者 LCA(最近公共祖先)技术来优化性能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值