题目大意
给定一棵树,输出树的每一层叶子节点个数。
输入格式
第一行为N(0<N<100)-总节点个数,M(<N)-非叶节点个数。
后M行格式为ID K ID[1] ID[2] ... ID[K]
,id为非叶节点号,k为此节点具有的孩子节点个数,k后面为其孩子节点编号。
输出格式
输出为树的每一层叶子节点的个数,一行输出,空格隔开,行末无空格。
样例输入
2 1
01 1 02
样例输出
0 1
解题思路
此题考察点为dfs。
将每个节点的孩子节点编号存于vector,遍历每个非叶子节点,若此节点的vector为空,则为叶子节点,记录所在层数,将记录此层数的叶子节点数组数值增一。
全部代码
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 vector<int> v[100]; 7 int maxlevel = 0; 8 int num[100] = { 0 }; 9 void dfs(int index, int level) 10 { 11 if (v[index].size() == 0) { 12 maxlevel = max(maxlevel, level); 13 num[level]++; 14 return; 15 } 16 for (int i = 0; i < v[index].size(); i++) 17 dfs(v[index][i], level + 1); 18 } 19 int main() 20 { 21 int n, m; 22 cin >> n; 23 if (n == 0) return 0; 24 cin >> m; 25 for (int i = 0; i < m; i++) { 26 int a, b; 27 cin >> a >> b; 28 for (int j = 0; j < b; j++) { 29 int t; 30 cin >> t; 31 v[a].push_back(t); 32 } 33 } 34 dfs(1, 0); 35 for (int i = 0; i <= maxlevel; i++) { 36 if (i == 0) cout << num[i]; 37 else cout << ' ' << num[i]; 38 } 39 }