地址 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 };