1、题目描述
2、解题思路
1、遍历 edges 数组,把它转为邻接链表表示的图;
2、定义一个全局变量 ans 表示最终返回的最长路径的边数;
3、遍历图,对每一个结点进行 DFS;
DFS的实现:
1、遍历当前结点的所有子结点进行 DFS,找出长度最长的两个路径 max1 和 max2;
2、更新 ans = Math.max(ans, max1 + max2),其中 max1 + max2 就好像是以当前点为圆心,加上两个半径,得到直径;
3、DFS 返回的是 Math.max(max1, max2);
3、解题代码
class Solution {
int res = 0;
public int treeDiameter(int[][] edges) {
List<Integer>[] map = new ArrayList[edges.length+1];
for(int i=0 ; i<map.length ; i++){
map[i] = new ArrayList<>();
}
for(int[] edge : edges){
map[edge[0]].add(edge[1]);
map[edge[1]].add(edge[0]);
}
dfs(map,0,new boolean[edges.length+1]);
return res;
}
public int dfs(List<Integer>[] map,int index,boolean[] visited){
visited[index] = true;
List<Integer> list = map[index];
int max1 = 0; // 第一大
int max2 = 0; // 第二大
for(int next : list){
if(!visited[next]){
int num = dfs(map,next,visited);
if(num>max1){
max2 = max1;
max1 = num;
} else if(num>max2){
max2 = num;
}
}
}
res = Math.max(res,max1+max2);
return Math.max(max1,max2)+1;
}
}