问题描述:给定一颗树,给出每一层没有孩子的结点数。
解题思路:层次遍历,记录当前层的起点to和终点last;层次遍历,如果当前点没有孩子,个数加一,否则将其孩子加入数组,当to==last时,开始新的一层。
AC代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>node[100];
int Node,non_leaf;
//freopen("test.txt","r",stdin);
scanf("%d %d",&Node,&non_leaf);
while(non_leaf){
int ID,K,leaf;
scanf("%d %d",&ID,&K);
while(K){
scanf("%d",&leaf);
node[ID].push_back(leaf);
--K;
}
--non_leaf;
}
vector<int>que;
vector<int>count;
count.push_back(0);
if(node[1].empty()){ //1没孩子
++count[0];
}else que.push_back(1); //有孩子压入队列
int to=0;
int last=que.size();
while(to<que.size()){ //队列里还有有孩子的结点
int c=0;
while(to<last){ //统计下一层结点
int a=que[to];
for(int i=0;i<node[a].size();++i){
if(node[node[a][i]].empty())++c;
else que.push_back(node[a][i]); //该节点有孩子,进入队列
}
++to;
}
last=que.size(); //下一层最后一个有孩子的结点
count.push_back(c);
}
for(int i=0;i<count.size();++i){
printf("%d",count[i]);
if(i!=count.size()-1)printf(" ");
}
return 0;
}