典型的树的层序遍历问题,用层序遍历或者广度优先搜索方法解决:
1. 用vector动态记录每个点的孩子的数目。
2.赋予相应的层号,在遍历中每当层号发生变化,说明该层遍历结束,应记录统计值。
c++代码如下:
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 110;
vector<int> ans; // 记录各层的答案
struct Node
{
int level;
vector<int> child;
} node[maxn]; //采用静态树
void levelOrder()
{
queue<Node> Q;
Q.push(node[1]);
node[1].level = 1;
int cnt = 0; //记录当前层的无孩子结点数目
int level = 0; //当前的层数
while(!Q.empty())
{
Node top = Q.front();
Q.pop();
if(top.level != level) //层数发生变化
{
level = top.level;
ans.push_back(cnt);
cnt = 0;
}
if(top.child.empty()) //当前结点无孩子
{
cnt++;
}
for(int i = 0; i < top.child.size(); i++)
{
node[top.child[i]].level = top.level + 1;
Q.push(node[top.child[i]]);
}
}
ans.push_back(cnt); //注意将最后一次的统计结果放入答案中
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
//输入
for(int i = 0; i < m; i++)
{
int k, id;
scanf("%d%d", &id, &k);
for(int i = 0; i < k; i++)
{
int child;
scanf("%d", &child);
node[id].child.push_back(child);
}
}
levelOrder();
for(int i = 0; i < ans.size(); i++)
{
if(i == 0)
printf("%d", ans[i]);
else
printf(" %d", ans[i]);
}
printf("\n");
}
return 0;
}