解法一:建树+广度优先遍历

设计好结点数据结构,边读入边建树,用 Map 保存结点防止重复创建同一编号的结点。建树后进行一次广度优先遍历计算每层的叶子结点数量。

  1. import java.util.*;
  2. import java.io.*;
  3. public class Main {
  4. public static void main(String[] args) throws IOException {
  5. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  6. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  7. in.nextToken();
  8. int N = (int) in.nval;
  9. in.nextToken();
  10. int M = (int) in.nval;
  11. // 处理特殊情况
  12. if (M == 0) {
  13. out.println(N);
  14. out.flush();
  15. return;
  16. }
  17. // 建树
  18. Map<Integer, TreeNode> map = new HashMap();
  19. for (int i = 0, id, cnt; i < M; ++i) {
  20. in.nextToken();
  21. id = (int) in.nval;
  22. in.nextToken();
  23. cnt = (int) in.nval;
  24. TreeNode root = map.getOrDefault(id, new TreeNode(id, cnt));
  25. for (int j = 0, childId; j < cnt; ++j) {
  26. in.nextToken();
  27. childId = (int) in.nval;
  28. TreeNode childNode = map.getOrDefault(childId, new TreeNode(childId));
  29. map.put(childId, childNode);
  30. root.next.add(childNode);
  31. }
  32. map.put(id, root);
  33. }
  34. // 层序遍历
  35. Queue<TreeNode> queue = new LinkedList<>();
  36. queue.offer(map.get(1));
  37. ArrayList<Integer> ans = new ArrayList<>();
  38. while (!queue.isEmpty()) {
  39. int cnt = 0;
  40. int size = queue.size();
  41. for (int i = 0; i < size; ++i) {
  42. TreeNode root = queue.poll();
  43. if (root.next.isEmpty()) {
  44. ++cnt;
  45. } else {
  46. for (TreeNode node : root.next) {
  47. queue.offer(node);
  48. }
  49. }
  50. }
  51. ans.add(cnt);
  52. }
  53. for (int i = 0; i < ans.size() - 1; ++i) {
  54. out.print(ans.get(i) + " ");
  55. }
  56. out.println(ans.get(ans.size() - 1));
  57. out.flush();
  58. }
  59. }
  60. class TreeNode {
  61. int id;
  62. List<TreeNode> next;
  63. TreeNode(int id) {
  64. this.id = id;
  65. next = new ArrayList<>();
  66. }
  67. TreeNode(int id, int capacity) {
  68. this.id = id;
  69. next = new ArrayList<>(capacity);
  70. }
  71. }