题目解析
给定每个节点的父节点,求出是否为满树。
输出最大的字数个数
如果是满树,则输出yes, 否则输出no
再输出树的前序遍历
解题思路
用list存储每个节点的根节点,然后枚举每个节点的个数。
如果每个节点的个数都不一样,那么就代表这个数不是满树。
在递归树的前序遍历即可
注: 可能会出现只有一个根节点的情况哦,这个是yes
代码
import java.io.*;
import java.util.*;
public class Main
{
static int N = (int) 1e5 + 10;
static ArrayList<Integer> ar[] = new ArrayList[N]; // 存储每个节点的子节点
static int size = 0; // 输出了几个数了(需要输出空格)
static void printTree(int u)
{
if (u != 0) // 如果当前节点不是根节点
{
if (size != 0)
out.print(" ");
out.print(u);
size++;
}
for (int i = 0; i < ar[u].size(); i++) // 遍历子节点
printTree(ar[u].get(i));
}
public static void main(String[] args)
{
int n = sc.nextInt();
for (int i = 0; i <= n; i++)
ar[i] = new ArrayList<Integer>();
for (int i = 1; i <= n; i++)
{
int x = sc.nextInt();
ar[x].add(i); // 父节点添加子节点
}
int max = 0, cnt = 0; // max最大值,cnt最大值的计数器
for (int i = 1; i <= n; i++)
{
Collections.sort(ar[i]); // 给子节点排序
int len = ar[i].size(); // 获取子节点的个数
if (len > max) // 如果超过了最大值
{
max = len; // 更新最大值
cnt++; // 计数器增加
}
}
out.println(max + " " + (cnt <= 1 ? "yes" : "no")); // 输出最大值,如果计数器的数量小于等于1,那么输出yes,否则输出no
printTree(0); // 从根节点开始递归
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}