/*建立树的链表,用递归的方式数每一层的叶节点数*/
#include <iostream>
#include <memory.h>
using namespace std;
int count[100]={0};
int maxlevel=1;
struct childLink //定义孩子链表
{
int no;
childLink *next;
childLink (){next=0;}
};
struct Node //定义树节点
{
int num;
childLink *head;
Node(){num=0;head=0;}
}*node;
void countLeaves(int l,int id) //求解树中每一层叶子节点的数目
{
childLink *cl=node[id].head;
++l;
while(cl)
{
if(maxlevel<l) maxlevel=l; //更新最大的层数
if(node[cl->no].num==0) ++count[l]; //如果该节点没有子节点,那么该层的叶子节点增加一个
else
countLeaves(l,cl->no); //递归求解每层的叶子节点数
cl=cl->next;
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int id;
node=(Node*)malloc(sizeof(Node)*(n+1));
memset(node,0,sizeof(Node)*(n+1));
childLink *cl=0;
for(int i=0;i<m;++i)
{
cin>>id;
cin>>node[id].num;
for(int j=0;j<node[id].num;++j) //尾插法建立孩子链表
{
cl= new childLink;
cin>>cl->no;
if(node[id].head) cl->next=node[id].head;
node[id].head=cl;
}
}
if(node[1].num==0)
{
count[0]=1;
maxlevel=0;
}
else
{
count[0]=0;
countLeaves(0,1);
}
cout<<count[0];
for(int i=1;i<=maxlevel;++i)
cout<<' '<<count[i];
cout<<endl;
}
return 0;
}
浙大PAT (Advanced Level) Practise 1004. Counting Leaves (30)
最新推荐文章于 2017-12-13 09:27:54 发布