题目链接:https://www.patest.cn/contests/pat-a-practise/1004
题目大意:求一课树中每一层叶子结点的个数。
解题思路:
- 二维数组tree[][]来存储树,tree[i][j]表示序号为i的结点的第j个孩子的序号。
- level[i]:表示序号为i的结点在level[i]层
- count[i]:表示第i层的叶子结点的数量
- 使用层次遍历,遍历每一层。计算每层的叶子结点个数
代码如下:
#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
int tree[101][102]={0},level[101],count[101]={0};
int main(int argc, char const *argv[])
{
int N,M;
cin>>N>>M;
int tmproot,childcnt;
for(int i=0;i<M;i++){
scanf("%02d %d",&tmproot,&childcnt);
for(int j=0;j<childcnt;j++){
scanf("%02d",&tree[tmproot][j]);
}
}
/*层次遍历*/
queue<int> q;
q.push(1);
level[1]=1;
int maxlevel=1;
while(!q.empty()){
int current=q.front();
q.pop();
if(maxlevel<level[current])
maxlevel=level[current];
if(tree[current][0]==0)//该树没有子节点
count[level[current]]++;
for(int j=0;tree[current][j]!=0;j++){
q.push(tree[current][j]);
level[tree[current][j]]=level[current]+1;//更新高度
}
}
cout<<count[1];
for(int i=2;i<=maxlevel;i++)
cout<<" "<<count[i];
return 0;
}