题目大意:给出一棵树中所有的非叶子节点,以及它们子节点的序号,要求输出每一层的叶子节点的个数。
和层数有关自然想到的是层序遍历,不过DFS也可以做。输入时记录所有非叶子节点的下标,层序遍历时根据是否是非叶子节点来更新每一层的叶子节点的个数,并记录最大层数。
如果用DFS,则递归到叶子节点时进行处理。
AC代码如下:
BFS:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstring>
using namespace std;
const int MAXN = 110;
struct Node
{
int layer;
vector<int> child;
Node():layer(0){};
}tree[MAXN];
bool isNotLeaf[MAXN] = {false};
int leafInLayer[MAXN] = {0};
void layerOrder(int node, int &maxLayer)
{
queue<int> q;
q.push(node);
while(!q.empty())
{
int now = q.front();
q.pop();
if(!isNotLeaf[now]) leafInLayer[tree[now].layer]++;
for (int i = 0; i < tree[now].child.size(); ++i)
{
int childId = tree[now].child[i];
tree[childId].layer = tree[now].layer + 1;
if(tree[childId].layer > maxLayer) maxLayer = tree[childId].layer;
q.push(childId);
}
}
}
int main()
{
int N, M;
cin >> N >> M;
if(N > 0)
{
for (int i = 0; i < M; ++i)
{
int id, childNum;
scanf("%d%d", &id, &childNum);
for (int j = 0; j < childNum; ++j)
{
int childId;
scanf("%d", &childId);
tree[id].child.push_back(childId);
}
isNotLeaf[id] = true;
}
int maxLayer = 0;
layerOrder(1, maxLayer);
for (int i = 0; i <= maxLayer; ++i)
{
printf("%d", leafInLayer[i]);
if(i < maxLayer) printf(" ");
}
}
return 0;
}
DFS:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstring>
using namespace std;
const int MAXN = 110;
struct Node
{
int layer;
vector<int> child;
Node():layer(0){};
}tree[MAXN];
bool isNotLeaf[MAXN] = {false};
int leafInLayer[MAXN] = {0};
void dfs(int node, int &maxLayer)
{
if(tree[node].child.size() == 0)
{
leafInLayer[tree[node].layer]++;
if(maxLayer < tree[node].layer) maxLayer = tree[node].layer;
return;
}
for (int i = 0; i < tree[node].child.size(); ++i)
{
int childId = tree[node].child[i];
tree[childId].layer = tree[node].layer + 1;
dfs(childId, maxLayer);
}
}
int main()
{
int N, M;
cin >> N >> M;
if(N > 0)
{
for (int i = 0; i < M; ++i)
{
int id, childNum;
scanf("%d%d", &id, &childNum);
for (int j = 0; j < childNum; ++j)
{
int childId;
scanf("%d", &childId);
tree[id].child.push_back(childId);
}
isNotLeaf[id] = true;
}
int maxLayer = 0;
dfs(1, maxLayer);
for (int i = 0; i <= maxLayer; ++i)
{
printf("%d", leafInLayer[i]);
if(i < maxLayer) printf(" ");
}
}
return 0;
}