PAT (Advanced Level) Practice 1004 Counting Leaves

版权声明:转载请注明出处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;
	}
} 

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/88843559