题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1004
考查链表。
记录下叶子节点信息,然后逐层嵌套count就可以了。
代码如下:
//#include "StdAfx.h"
#include <iostream>
#include <memory.h>
using namespace std;
int count[100]={0};
int maxlevel=1;
struct childLink //孩子链表
{
int id;
childLink *next;
childLink(){next=0;}
};
struct Node //树节点
{
int childNum;
childLink *childHead;
Node(){childNum=0;childHead=0;}
}*node;
void countLeaves(int l,int id) //嵌套求解不同层次节点中叶子节点的个数
{
childLink *cl = node[id].childHead;
l++;
while(cl)
{
if(maxlevel<l)
maxlevel=l;
if(node[cl->id].childNum==0)
count[l]++;
else
countLeaves(l,cl->id);
cl=cl->next;
}
}
int main()
{
//freopen("D://test.txt","r",stdin);
int n,m;
int i,j,id;
cin>>n>>m;
node=(Node *)malloc(sizeof(Node)*(n+1));
memset(node,0,sizeof(Node)*(n+1));
childLink *cl=0;
for(i=0;i<m;i++)
{
cin>>id;
cin>>node[id].childNum;
for(j=0;j<node[id].childNum;j++)
{
cl = new childLink;
cin>>cl->id;
if(node[id].childHead) cl->next=node[id].childHead;
node[id].childHead = cl;
}
}
if(node[1].childNum==0){count[0]=1;maxlevel=0;}
else
{
count[0]=0;
countLeaves(0,1);
}
for(i=0;i<maxlevel;i++)
cout<<count[i]<<" ";
cout<<count[i]<<endl;
return 0;
}