1. 原题链接
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]);
}
}