PAT 1004 Counting Leaves

题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184

解法

输入一个树,输出树每层的子节点数目(节点1始终为根)
树输入时不按自顶向下顺序,乱序输入。因此无法建树时确定每个节点所在层数
因此建树时只需要保存每个节点的子节点信息,利用dfs层序遍历即可
推荐按照树的数据结构存储,这样dfs代码简介

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
vector<vector<int>> tree;
int N, M;
vector<int> res;

void dfs()
{
    queue<int> q;
    int laynum;  // 每层节点数
    int emptnum;   // 每层子节点数
    q.push(1); 
    while(!q.empty())
    {
        laynum = q.size();
        emptnum = 0;
        while(laynum--)     // 遍历当前层
        {
            int fnt = q.front();
            if(tree[fnt].empty())  //  每层的节点判断是否为子节点 
                emptnum++;  
            else 
            {
                for(auto& ch : tree[fnt])  // 非子节点则将其子节点加入下一层
                    q.push(ch);
            }
            q.pop();
        }
        res.push_back(emptnum);
    }
}

int main()
{
    cin >> N >> M;
    if(N == 0) return 0;
    tree.reserve(N+1);
    for(int i = 0; i < M; i++)
    {
        int node, k;  cin >> node >> k;
        for(int j = 0; j < k; j++)
        {
            int child;  cin >> child;
            tree[node].push_back(child);
        }
    }
    dfs();
    cout << res[0];
    for(int i = 1; i < res.size(); i++)
        cout << " " << res[i];
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。