【LeetCode - 1245】树的直径

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;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值