PAT 1004 树的层序遍历
这题要统计树的每一层中叶节点的个数。可以用二维矩阵来存储树,然后层序遍历即可。
关于如何确定层数,可以在每一层的后面加一个标识节点,每次取到这个标识节点,说明后面一层已经全部加入队列了(如果队列不为空,为空说明这是最后一层了,这时不要加,否则会卡在最后),这个时候再在队列后面加一个标识节点标识下一层的结束,依次类推。
#include <cstdio>
#include <string.h>
#include <queue>
using namespace std;
const int maxn = 105;
int tree[maxn][maxn];
int res[maxn];
int N = 0;
int M = 0;
int pos = 0;
queue<int> q;
void bfs(){
q.push(1);
q.push(-1);
while(!q.empty()){
if(q.front()==-1){
q.pop();
pos++;
if(!q.empty())
q.push(-1);
}
else{
int root = q.front();
//printf("%d\n",root);
q.pop();
bool flg = false;
for(int i = 1;i <= N; i++) {
if(tree[root][i] == 1){
q.push(i);
flg = true;
}
}
if(!flg){
res[pos]++;
}
}
}
}
int main(){
while(1){
memset(tree, 0, sizeof(tree));
memset(res, 0, sizeof(res));
N = 0;M = 0;pos = 0;
while(!q.empty()) q.pop();
scanf("%d%d",&N,&M);
if(!N) break;
for(int i = 0;i < M;i++){
int root = 0;
int K = 0;
scanf("%d%d",&root,&K);
for(int j = 0;j < K;j++){
int tmp = 0;
scanf("%d",&tmp);
tree[root][tmp] = 1;
}
}
bfs();
for(int i = 0;i < pos-1;i++){
printf("%d ",res[i]);
}
printf("%d\n",res[pos-1]);
}
}
15ms