1、问题描述
对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含 N 个结点的多叉树,结点从 1 至 N 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为 0 。
2、代码实现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main{
//key:父结点,value:子结点
static Map<Integer,ArrayList<Integer>> tree = new HashMap<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Integer n = scanner.nextInt();
//接收父结点
for(int i = 2;i <= n;i++) {
Integer parent = scanner.nextInt();
//如果树中没有这个父结点,我们就创建它
if(!tree.containsKey(parent)) {
ArrayList<Integer> list = new ArrayList<>();
tree.put(parent, list);
}
// i 表示 第几个结点,将他添加到指定父结点中
tree.get(parent).add(i);
}
int depth = dfs(1);
System.out.println(depth);
}
public static int dfs(int n) {
//结束条件,该结点没有子结点
if(!tree.containsKey(n)) {
return 0;
}
ArrayList<Integer> list = tree.get(n); //获取这颗子树
int size = list.size(); // 子树的高度
// 遍历这颗子树,求子树的最大高度
int max = 0;
for(Integer i : list) {
max = Math.max(max, dfs(i));
}
return size + max;
}
}