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;
}
posted @ 2021-01-13 22:00  a-shy-coder  阅读(54)  评论(0)    收藏  举报