第 12 场双周赛:5098. 树的直径(DFS)

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

我们用一个由所有「边」组成的数组 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 会形成一棵无向树

思路:这题和之前打ACM做的题一模一样,一般求解树的直径的问题,最简单高效的方法是先从任意一个点出发进行搜索,直到走到一个最远的点,我们可以证明这个点一定是直径的一个端点,然后再从这个点为起点进行搜索,直到到达从该点出发到达的最远的点,其经过的路径一定是树的直径。

我在LeetCode上放的题解:我的题解

import java.util.Vector;
class Solution {
	int ans=0,index=0;
	Vector<Integer>[] q;
    public int treeDiameter(int[][] edges) {
        q=new Vector[edges.length+1];
        for(int i=0;i<=edges.length;i++)
        	q[i]=new Vector();
        for(int i=0;i<edges.length;i++) {
        	q[edges[i][0]].add(edges[i][1]);
        	q[edges[i][1]].add(edges[i][0]);
        }
        dfs(0,-1,0);
        dfs(index,-1,0);
        return ans;
    }				
    
    private void dfs(int u,int p,int sum) {
    	for(int i=0;i<q[u].size();i++) {
    		if(q[u].get(i)==p)
    			continue;
    		dfs(q[u].get(i),u,sum+1);
    	}
    	if(sum>ans) {
    		ans=sum;
    		index=u;
    	}
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值