地址 https://leetcode-cn.com/contest/biweekly-contest-12/problems/tree-diameter/算法
给你这棵「无向树」,请你测算并返回它的「直径」:这棵树上最长简单路径的 边数。数组
咱们用一个由全部「边」组成的数组 edges
来表示一棵无向树,其中 edges[i] = [u, v]
表示节点 u
和 v
之间的双向边。ide
树上的节点都已经用 {0, 1, ..., edges.length}
中的数作了标记,每一个节点上的标记都是独一无二的。spa
示例1code
输入:edges = [[0,1],[0,2]] 输出:2 解释: 这棵树上最长的路径是 1 - 0 - 2,边数为 2。
示例2blog
输入:edges = [[0,1],[1,2],[2,3],[1,4],[4,5]] 输出:4 解释: 这棵树上最长的路径是 3 - 2 - 1 - 4 - 5,边数为 4。
算法1
求无向树最远距离 分为两步
1 任选一点 BFS或者DFS获取离该点最远的点
2 以第一步获得的点为起点 再次BFS或者DFS获取距离最远的点。二者距离就是最远距离leetcode
C++ 代码get
1 class Solution { 2 public: 3 pair<int, int> bfs(vector<vector<int>>& e, int start) { 4 vector<int> d(e.size(), -1); 5 6 queue<int> Q; 7 Q.push(start); 8 d[start] = 0; 9 10 pair<int, int> ret; 11 12 while (!Q.empty()) { 13 int x = Q.front(); 14 Q.pop(); 15 ret.first = x; 16 ret.second = d[x]; 17 for (auto& y : e[x]) { 18 if (d[y] == -1) { 19 d[y] = d[x] + 1; 20 Q.push(y); 21 } 22 } 23 } 24 return ret; 25 } 26 27 int treeDiameter(vector<vector<int>>& edges) { 28 int n = edges.size() + 1; 29 vector<vector<int>> e(n, vector<int>()); 30 for (auto& edge: edges) { 31 e[edge[0]].push_back(edge[1]); 32 e[edge[1]].push_back(edge[0]); 33 } 34 35 pair<int, int> p; 36 p = bfs(e, 0); 37 p = bfs(e, p.first); 38 39 return p.second; 40 } 41 };