本题的关键是要求出每一层的无叶节点个数, 为了让判断是否无儿子方便,我用一个动态二维数组存储,将节点存在行坐标为其父节点的数组元素下。具体思路是,每个节点平均要访问俩次一次判断是否有儿子,一次将其儿子节点存储以便下一层的统计。
同时要注意不能将为兄弟的节点分到不同层!
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef struct treenode* tree;
/*struct treenode
{
int id;
tree fristson,sibling;
};*/
int main()
{
int n,m,i,nm,k,son,j;
cin>>n>>m;
vector<vector<int> >family(n+1,vector<int>(101,0));
for(i=0;i<m;i++)
{
cin>>nm>>k;
for(j=0;j<k;j++)
{
cin>>son;
family[nm][j]=son;
}
}
//family[0][0]=1;
int f,t,cnt;
vector<int>c;
queue<int>q;
queue<int>tmp;
// q.push(0);
tmp.push(1);
while(!tmp.empty()||!q.empty())
{
cnt=0;
while(!tmp.empty())
{
t=tmp.front();
tmp.pop();
q.push(t);
/* for(i=0;family[t][i]!=0;i++)
{*/
// q.push(family[t][i]);
if(family[t][0]==0)
++cnt;
}
while(!q.empty())
{
f=q.front();
q.pop();
for(i=0;family[f][i]!=0;i++)
{
tmp.push(family[f][i]);
}
}
c.push_back(cnt);
}
for(i=0;i<c.size();i++)
{
i!=c.size()-1?cout<<c[i]<<" ":cout<<c[i];
}
return 0;
}