版权声明:转载请注明出处https://blog.csdn.net/hhmy77 https://blog.csdn.net/hhmy77/article/details/88843559
N个结点 M个非叶子节点,然后读入M行数据,表示树的存储结构
思路
1.用二维数组来存储树,数组一维序号代表这个节点,而它的值代表的是叶子节点
2.用BFS来遍历树, 确认每一层的关系
AC代码:
#include<iostream>
#include<vector>
#include<queue>
#include<stdio.h>
using namespace std;
const int maxn=110;
vector<int>ary[maxn];
int book[maxn]={0};
int main()
{
// 初始化数组 写不写都可以
// for(int i=0;i<maxn;i++)
// {
// ary[i].clear();
// book[i]=0;
// }
//N个结点和M个非叶子节点
int N,M;
scanf("%d %d",&N,&M);
for(int i=0;i<M;i++)
{
int k=0;
int inx=0;
cin>>inx>>k;
int tmp=0;
for(int j=0;j<k;j++)
{
cin>>tmp;
ary[inx].push_back(tmp);
}
}
//保存序号的队列
queue<int>que;
que.push(1);
int cnt=1;
int index=0;
while(!que.empty())
{
int len=que.size();
//这一层要遍历完当前层数的结点
for(int i=0;i<len;i++)
{
index=que.front();
que.pop();
//如果这一层结点的某个结点没有子结点
if(ary[index].size()==0)
{
book[cnt]++;
continue;
}
//入队结点的子结点
for(int j=0;j<ary[index].size();j++)
{
que.push(ary[index][j]);
}
}
cnt++;
}
bool p=false;
for(int i=1;i<cnt;i++)
{
if(p)printf(" ");
printf("%d",book[i]);
p=true;
}
}