树的直径
描述
给定一棵树,求出这棵树的直径,即树上最远两点的距离。包含n个结点,n-1条边的连通图称为树。
解题
树
/**
* 树
*/
public class Interval {
int start;
int end;
}
Solution
/**
* 找出树中存在的最大权值长度
*/
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Solution {
class Node{
int id,dist;
public Node(){}
public Node(int id, int dist) {
this.id = id;//序号
this.dist = dist;//权值
}
}
int maxv=0;
List<Node>[] g;
public int solve(int n,Interval[] Tree_edge,int[] Edge_value){
g=new List[n];
for (int i = 0; i < n; i++) {
g[i]=new LinkedList<>();//将树转为边表示法
}
for (int i = 0; i < n-1; i++) {
int x=Tree_edge[i].start,y=Tree_edge[i].end;
g[x].add(new Node(y,Edge_value[i]));
g[y].add(new Node(x,Edge_value[i]));
}
dfs(0,-1);
return maxv;
}
public int dfs(int root, int parent) {
List<Integer> list=new LinkedList<>();
for (Node v:g[root]){
if(v.id==parent) continue;//先序遍历
list.add(dfs(v.id,root)+v.dist);
}
Collections.sort(list);
int n=list.size(),val=0;
for (int i = n-1; i >=0&&i>=n-2 ; i--) {
val+=list.get(i);//最大的两子树的连接权值
}
maxv=Math.max(maxv,val);
return n==0? 0:list.get(n-1);
}
}