题目要求

解题思路

题目要求是求出每一层的叶子节点的个数,首先考虑存储方式,你可以选择用vector<int>来存储,然后使用layer和num数组分别存放当前节点的层数和当前层数叶子节点总数;你也可以用vector<node>来存储,那么node这个结构体你就可以把层数放进去,无需单独创建layer数组,至于后面输出每一层的叶子节点,只能再去遍历一遍,可以选择用bfs遍历,用一个count来记录一层的叶子节点,每层结束你就输出count的值。

确定好存储方式后,可以用bfs或者dfs实现,具体细节如下。

代码实现

  • dfs
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<sstream>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;

constexpr auto MAXN = 100;

vector<int> f[MAXN];      //用变长数组存储
vector<int> layer(MAXN);  //表示当前节点处在哪一层
vector<int> num(MAXN);        //表示当前层数的叶子节点个数
int maxlevel=0;             //表示最大的层数,即这棵树一共有几层

//lay表示层数
void dfs(int index,int lay)
{
    if(f[index].size()==0)
    {
        num[lay]++;
        maxlevel=max(maxlevel,lay);
    }
    for(int i=0;i<f[index].size();++i)
    {
        dfs(f[index][i],lay+1);
    }
}

int main()
{
#ifdef ONLINE_JUDGE                
#else    
    freopen("1.txt", "r", stdin);
#endif 
    int n,m;

    cin>>n>>m;

    int father,temp,child;

    for(int i=0;i<m;++i)
    {
        cin>>father>>temp;
        for(int j=0;j<temp;++j)
        {
            cin>>child;
            f[father].push_back(child);
        }
    }

    dfs(1,1);
    for(int i=1;i<=maxlevel;++i)
    {
        if(i==1)
        {
            cout<<num[i];
        }
        else
        {
            cout<<" "<<num[i];
        }
    }

    system("pause");
    return 0;
}
  • bfs
/*
 * @filename: 
 * @description: 
 * @author: 可爱
 * @lastEditors: cute
 * @Date: 2022-05-02 21:34:32
 * @LastEditTime: 2022-05-05 22:27:03
 * @Copyright: 此处写项目版本号
 */

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<sstream>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;

constexpr auto MAXN = 100;

vector<int> f[MAXN];
vector<int> layer(MAXN);  //表示当前节点处在哪一层
vector<int> num(MAXN);        //表示当前层数的叶子节点个数
int maxlevel=0;

void bfs()
{
    queue<int> q;
    q.push(1);
    layer[1]=1;

    while(!q.empty())
    {
        int index=q.front();
        q.pop();

        maxlevel = max(layer[index],maxlevel);
        if(f[index].size()==0)
        {
            //说明该节点是叶子节点
            num[layer[index]]++;
        }
        else
        {   
            //说明不是叶子节点,那就正常入队,把当前节点的孩子节点入队即可
            for(int i=0;i<f[index].size();++i)
            {
                q.push(f[index][i]);
                layer[f[index][i]]=layer[index]+1;
            }

        }
    }
}

int main()
{
#ifdef ONLINE_JUDGE                
#else    
    freopen("1.txt", "r", stdin);
#endif 
    int n,m;

    cin>>n>>m;

    int father,temp,child;

    for(int i=0;i<m;++i)
    {
        cin>>father>>temp;
        for(int j=0;j<temp;++j)
        {
            cin>>child;
            f[father].push_back(child);
        }
    }

    bfs();
    for(int i=1;i<=maxlevel;++i)
    {
        if(i==1)
        {
            cout<<num[i];
        }
        else
        {
            cout<<" "<<num[i];
        }
    }

    system("pause");
    return 0;
}

lionの金库