L2-051 满树的遍历 - java

题目解析

给定每个节点的父节点,求出是否为满树。

输出最大的字数个数
如果是满树,则输出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);

}

ArrayList
ArrayList

Collections.sort


团体程序设计天梯赛-练习集-java

赞赏