PAT 1004 Counting Leaves 统计树的每层叶子节点的个数
题目描述
原题链接
题目大意是让求出树中每层的叶子结点数
分析
我们可以根据输入,处理出每个节点所在深度, 即 该节点深度 = 父节点深度 + 1
从而选择BFS或者DFS遍历整棵树, 求出每层的叶子结点数, 从而维护出一个cnt[i]记录第i层的叶子节点数
坑点
1.非叶子节点的序号不一定按顺序给出, 所以要在输入完成后, 再处理每个节点的层次.
(借用一下大佬的图) 图的出处
2. 若采用下述方法, 注意在只有一个节点的时候, 特判输出"1"
实现
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 109;
int n, m; // 总结点数, 非叶子节点数
int maxlayer; // 这棵树的最大层次
int layer[N]; // 节点的层次
int cnt[N]; // 每一层次的节点个数
vector<int> v[N]; // 非叶子节点的孩子节点序列
void bfs()
{
queue<int> q;
q.push(1);
cnt[1] = 0;
while(!q.empty())
{
int top = q.front();
q.pop();
if(v[top].size() == 0) cnt[layer[top]]++;
else
{
for(int i=0; i<v[top].size(); i++)
{
int child = v[top][i];
layer[child] = layer[top] + 1;
maxlayer = max(maxlayer, layer[child]); // 维护出一个树的最大深度, 方便输出
q.push(v[top][i]);
}
}
}
}
int main()
{
cin >> n >> m;
if(n==1 && m==0) cout << "1" << endl;
else
{
for(int i=0; i<m; i++)
{
int id, k;
cin >> id >> k;
for(int j=0; j<k; j++)
{
int temp_id;
cin >> temp_id;
v[id].push_back(temp_id);
}
}
layer[1] = 1;
bfs();
for(int i=1; i<=maxlayer; i++)
{
if(i!=1) cout << " ";
cout << cnt[i];
}
}
return 0;
}


浙公网安备 33010602011771号