PAT A1004 Counting Leaves (30分)
题目
题目大意
按照题目要求输入节点信息,统计每一层时叶子节点的数量
大体思路
本质上就是构建一棵多叉树,根据题目数据输入的特性,采用静态构建多叉树,遍历访问每一个节点,判断该节点是不是叶子节点,如果是则相应的层数加1。该题可采用BFS和DFS,个人认为DFS写起来比较容易理解简洁。
代码
#include<stdio.h>
#include<vector>
using namespace std;
const int maxn=110;
//定义节点的结构体
struct node{
vector<int> child;
}tree[maxn];
int n,m,MAX=0;//MAX代表最大层数
int leafnum[maxn]={0};//每一层叶子节点的数量
void DFS(int root,int depth){
if(tree[root].child.size()==0){//如果没有子节点,则表示该节点为叶子节点
leafnum[depth]++;
if(depth>MAX){
//更新最大层数,方便输出
MAX=depth;
}
}
for(int i=0;i<tree[root].child.size();i++){
int child=tree[root].child[i];//访问该节点的子节点
DFS(child,depth+1);//同时深度加1
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
int r,num;
scanf("%d %d",&r,&num);
for(int j=0;j<num;j++){
int mem;
scanf("%d",&mem);
tree[r].child.push_back(mem);//将该节点添至为子节点
}
}
DFS(1,0);//因为root节点id为1,第一层深度定义为0
for(int i=0;i<=MAX;i++){
//按照格式输出每一层叶子节点数
if(i!=0){
printf(" ");
}
printf("%d",leafnum[i]);
}
return 0;
}