1004. Counting Leaves (30)

1. 原题链接

1004. Counting Leaves (30)

2. 理解题目

给出一棵树的信息(不是二叉树),格式:父结点id 子结点个数 子结点id ;求出每一层的叶子结点的个数;
(根结点的id=01,层数为1)

3. 解题思路

[思路]

可以采用结构体来存储孩子结点的id:由于孩子结点个数不确定,所以可以采用vector的C++容器进行保存,比较方便;
用一个数组leafnode[]来保存每一层的叶子结点个数;要求出每一层的叶子结点个数,则肯定要遍历;这里采用DFS来遍历,用递归的写法;
然后判断该结点的子孩子是否有,如果没有就在对应层leafnode[]数组中加一;最后输出leafnode[]的内容即可;

备注题目中的seniority level是什么意思??如果可以理解,欢迎邮箱交流~~

4. 关键点

[提炼模板]: DFS中,可以用根节点id进行递归,同时增加参数layer可以用于标记对应层;

5. AC代码


#include<cstdio>
#include<vector>
using namespace std;
const int maxn=110;

struct Node{ 
    vector<int> ch;//vector<int> 数组ch; 
}node[maxn];

int leafnode[maxn]={0};//每层的叶结点个数 
int lay_max=0;//最大层数

void dfs(int root,int layer){
    lay_max=lay_max>layer? lay_max:layer; //遍历过程中保存最大层数
    if(node[root].ch.size()==0){
        leafnode[layer]++; //对应层的叶子节点数加1
        return;
    }else{
        for(int i=0;i<node[root].ch.size();i++){
            dfs(node[root].ch[i],layer+1);
        }
    }
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    int id,num,tmp;
    //记录树信息 
    for(int i=0;i<m;i++){
        scanf("%d%d",&id,&num); 
        for(int j=0;j<num;j++){
            scanf("%d",&tmp);
            node[id].ch.push_back(tmp);
        }
    }
    dfs(1,1); //递归开始:根节点Id和对应的层号1;
    for(int i=1;i<=lay_max;i++){
        if(i==1) printf("%d",leafnode[i]);
        else printf(" %d",leafnode[i]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值