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
解题思路
题目大意: 通过数组的形式表式二叉树的分支,通过bfs遍历,计数
解题代码
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
vector<int> v[100];
int num[100] = {0}, depth = -1;
map<int, int> m;
void bfs(int i){
queue<int> q;
q.push(i);
// 通过map集合的形式,表示每个数位于第几层
m[1] = 0;
while (!q.empty()){
int f = q.front();
q.pop();
if(v[f].size() == 0){
num[m[f]]++;
depth = max(depth, m[f]);
}else{
for(int j = 0; j < v[f].size(); j++){
q.push(v[f][j]);
m[v[f][j]] = m[f] + 1;
}
}
}
}
int main(){
int nodes, nlnodes;
cin >> nodes >> nlnodes;
for (int i = 0; i < nlnodes; i++){
int nlnodeid, k, t;
cin >> nlnodeid >> k;
for (int j = 0; j < k; j++){
cin >> t;
v[nlnodeid].push_back(t);
}
}
bfs(1);
for(int i = 0 ; i < depth; i++){
cout << num[i] << " ";
}
cout << num[depth];
return 0;
}