题目重述:
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 0<N<100, the number of nodes in a tree, and M (<N), the number of non-leaf nodes. Then M lines follow, each in the format:
ID K ID[1] ID[2] ... ID[K]
where ID
is a two-digit number representing a given non-leaf node, K
is the number of its children, followed by a sequence of two-digit ID
's of its children. For the sake of simplicity, let us fix the root ID to be 01
.
The input ends with N being 0. That case must NOT be processed.
Output Specification:
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.
The sample case represents a tree with only 2 nodes, where 01
is the root and 02
is its only child. Hence on the root 01
level, there is 0
leaf node; and on the next level, there is 1
leaf node. Then we should output 0 1
in a line.
Sample Input:
2 1
01 1 02
Sample Output:
0 1
题目理解:
题目背景,家族等级制度通常用谱系树来表示,现在需要统计没有孩子的急停成员
输入:N(0< N < 100 )结点个数 ,M非叶节点数
接下来的M行,ID 非叶节点编号, k 孩子数目, ID[i] 第i个孩子
输出:从根开始每一层的叶子 结点个数
思路:感觉 自己对数据结构的应用可以说是超级不熟练了,哭泣。
我的思路:设置两个队列,一个current用于存放当前层节点,一个next用于存放下一层节点,遍历current数组,检查孩子数组每一个成员是否有孩子,若有则孩子入next队列,若无则本层叶节点数目++,遍历完成后,输出叶节点数目,将叶节点数目置0,交换current和next,直到全部遍历完成。明明看起来还很对,奈何结构体界没有构建好。。。
借鉴思路( https://blog.csdn.net/CV_Jason/article/details/80901866):借助一个Queue
将每个结点的子结点的ID按顺序入队,然后遍历每一个结点的所有子结点,对于vector.size()==0
的情况,判定其为叶子结点,并做统计。递归执行上述过程,直到所有的结点都出队。
借鉴代码
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int level[100];// 保存当前结点的所在层数
int book[100];// 记录每层
int maxlevel = -1;
vector<int> v[100];
void bfs(){
queue<int> q;
q.push(1);
level[1] = 0;
while(!q.empty()) {
// 获取队首元素
int index = q.front();
q.pop();
// 更新最大层数
maxlevel = max(level[index], maxlevel);
if(v[index].size() == 0)
book[level[index]]++;// 统计所在层数的叶子结点
// 对index结点的所有子结点进行遍历
for(int i = 0; i < v[index].size(); i++) {
q.push(v[index][i]);// 子结点入队
level[v[index][i]] = level[index] + 1;// 同时记录结点的所在层次
}
}
}
int main() {
int n, m, k, node, c;
cin>>n>>m;
for(int i = 0; i < m; i++){
cin>>node>>k;
for(int j = 0; j < k; j++) {
cin>>c;
v[node].push_back(c);
}
}
bfs();
cout<<book[0];
for(int i = 1; i <= maxlevel; i++)
cout<<" "<<book[i];
return 0;
}