左孩子右兄弟 - 蓝桥云课 (lanqiao.cn)
这个题讲解一下思路。
看图
把样例转为二叉树:
我们可以发现所谓左孩子右兄弟就是说把一个节点的所有孩子节点中选取一个作为左子节点,这个节点的剩余孩子节点依次链接在这个左孩子节点的右边,直到某个节点有孩子节点再把它挂在左边。这就是左孩子右兄弟。为了从让二叉树的高度最大,我们使得根节点1的带有最多孩子节点的某个孩子节点在最下部。
而我们解答题目的关键就是计算根节点有几个孩子,根节点孩子的数量同时加上以这些孩子为根节点的子树的最大深度。以此一层一层类推进行递归处理。
import java.awt.PageAttributes.OriginType;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.math.MathContext;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br.readLine().split(" ");
int a=Integer.parseInt(aStrings[0]);
int b;
for(b=1;b<=a+1;b++) {
al1[b]=new ArrayList<>();
}
for(b=2;b<=a;b++) {
String[] bStrings=br.readLine().split(" ");
int c=Integer.parseInt(bStrings[0]);
al1[c].add(b);//根节点为c的节点存储了一个子节点b
}
System.out.println(dfs(1));
}
public static int aa=100009;
public static ArrayList<Integer>[] al1=new ArrayList[aa];//数组编号代表着根节点编号
public static int dfs(int a) {
int b;
int count=0;//由于只有根节点1默认为树的高度为0.所以以孩子节点的子数的高度在只有孩子节点时也为0
int c=al1[a].size();
for(b=0;b<c;b++) {
count=Math.max(count, dfs(al1[a].get(b)));
}
return count+al1[a].size();
}
}