pat1004
1.题目大意
给定一棵树,输出每一层的叶子节点。
由于不是普通的二叉树,有可能一个父节点有多个子节点。所以使用灵界表法进行输出。
2.思路
使用dfs,进行统计层数,每一层都进行加一。使用灵界表,需要e,ne,h三个数组,h数组全部都是-1.还有一个add,就是添加子节点。使用idx进行来检索
e【idx】=b,ne【idx】=h【a】,h【a】=idx++。必备代码
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
第二个就是dfs来进行统计层数,叶结点就是h【u】=-1,同时进行返回,不再遍历
cnt【depth】++,
然后更新最大值,在对所有的子节点进行遍历
void dfs(int u, int depth)
{
if (h[u] == -1) // 说明u是叶子节点
{
cnt[depth] ++ ;
max_depth = max(max_depth, depth);
return;
}
for (int i = h[u]; ~i; i = ne[i])
dfs(e[i], depth + 1);
}
3.代码实
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n, m;
int h[N], e[N], ne[N], idx;
int cnt[N], max_depth;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u, int depth)
{
if (h[u] == -1) // 说明u是叶子节点
{
cnt[depth] ++ ;
max_depth = max(max_depth, depth);
return;
}
for (int i = h[u]; ~i; i = ne[i])
dfs(e[i], depth + 1);
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for (int i = 0; i < m; i ++ )
{
int id, k;
cin >> id >> k;
while (k -- )
{
int son;
cin >> son;
add(id, son);
}
}
dfs(1, 0);
cout << cnt[0];
for (int i = 1; i <= max_depth; i ++ ) cout << ' ' << cnt[i];
cout << endl;
return 0;
}