题意:
给定一棵树,计算每层的叶子节点个数;
分析:
1、显然用队列(java自带或者自己用数组实现都行),题目中已经说明根结点是01,那么就先把根结点入队列;
2、对每层的节点进行遍历,有子节点的子节点入队列,没有子节点的就是我们需要的叶子节点,即该层的叶子节点数目加1;
3、只是需要计算出每层节点的数目
4、很显然要用两个循环,外层循环到遍历完树的各层(但是因为事先不知道树的层数,所以只能写 到节点遍历完结束),内层循环遍历每层的节点
总结:本来很快写完了代码,但是结果总不对,又审一遍题意,发现变量M的意思记错了,汗Σ( ° △ °|||)︴,以后定义每个变量的时候要确保不会错意!!!
package AdvancedLevelPractice;
import java.util.Scanner;
public class pat1004 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
try {
int N = scanner.nextInt();
int M = scanner.nextInt();
int[][] tree = new int[N+1][N+1];
int[] num = new int[N+1];
int ID, K;
for(int i = 0; i < M; i++){
ID = scanner.nextInt();
K = scanner.nextInt();
num[ID] = K;
for(int j = 0; j < K; j++){
tree[ID][j] = scanner.nextInt();
}
}
int[] q = new int[N+1];
int[] results = new int[N+1];
int[] nodes = new int[N+1];
int front = 0, end = 1, layers = 0, count = 0;
q[front] = 1;
nodes[layers] = 1;
while(front < end){
count = 0;
while (count < nodes[layers]) {
if(num[q[front]] == 0){
results[layers]++;
}
nodes[layers + 1] += num[q[front]];
for(int i = 0; i < num[q[front]]; i++){
q[end++] = tree[q[front]][i];
}
count++;
front++;
}
layers++;
}
for(int i = 0; i < layers-1; i++){
System.out.print(results[i]+" ");
}
System.out.print(results[layers-1]);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}