import java.util.*;
public class Main{
public static class TreeNode{
TreeNode left;
TreeNode right;
int val;
public TreeNode(int val){
this.val = val;
}
}
public static class ReturnType{
int maxLength;
int height;
public ReturnType(int maxLength,int height ){
this.maxLength = maxLength;
this.height = height;
}
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
String[] arrLine = line.split(" ");
int n = Integer.valueOf(arrLine[0]);
int root = Integer.valueOf(arrLine[1]);
TreeNode[] arrNode = new TreeNode[n];
for(int i=0;i<n;i++){
arrNode[i] = new TreeNode(i+1);
}
for(int i=0;i<n;i++){
String newline = scanner.nextLine();
arrLine = newline.split(" ");
int head = Integer.valueOf(arrLine[0]);
int left = Integer.valueOf(arrLine[1]);
int right = Integer.valueOf(arrLine[2]);
if(left!=0){
arrNode[head-1].left = arrNode[left-1];
}
if(right!=0){
arrNode[head-1].right = arrNode[right-1];
}
}
int res = getMaxLength(arrNode[root-1]).maxLength;
System.out.println(res);
}
public static ReturnType getMaxLength(TreeNode root){
if(root == null){
return new ReturnType(0,0);
}
ReturnType leftData = getMaxLength(root.left);
ReturnType rightData = getMaxLength(root.right);
int height = Math.max(leftData.height,rightData.height)+1;
int MaxChildLength = Math.max(leftData.maxLength,rightData.maxLength);
int TwoChildLength = leftData.height+rightData.height+1;
return new ReturnType(Math.max(MaxChildLength,TwoChildLength),height);
}
}
首先分析当前头结点,最大距离可能的情况
- 右子树的最大距离
- 左子树的最大距离
- 右子树深度+左子树深度+1
因此需要返回的信息是:
以该点为头结点时:
- 当前最大距离
- 深度
每次判断出最大距离的三个情况中最大的
还要计算当前深度,为左子树右子树偏大的深度+1