题意:给你一个家谱树,找到没有孩子的人,即寻找每层的叶子结点数
方法一:用dfs。采用vector
数组作为树的存储结构,将树结点逐一输入到vector
中,每一个元素存储了该结点的子孩子信息,自动向下探索子孩子,直到vector[i].size()==0
表明该结点的子孩子为零,即叶子结点。
#include <bits/stdc++.h>
using namespace std;
int N,M;
vector<int> v[101];
int res[101],maxdepth=-1;
void dfs(int f,int depth)
{
if(v[f].size() == 0){
res[depth]++;
if(depth>maxdepth)
maxdepth = depth;
return;
}
for(int i=0;i<v[f].size();i++){
dfs(v[f][i],depth+1);
}
}
int main()
{
memset(res,0,sizeof(int));
cin>>N>>M;
for(int i=0;i<M;i++){
int father;
cin>>father;
int k;
cin>>k;
for(int j=0;j<k;j++){
int child;
cin>>child;
v[father].push_back(child);
}
}
dfs(1,0);
cout<<res[0];
for(int i=1;i<=maxdepth;i++)
cout<<" "<<res[i];
cout<<endl;
return 0;
}
方法二:bfs
vector<int> v[101];
int result[101], level[101], maxLevel = -1; //level用来记录每个节点对应的层数
void bfs()
{
queue<int> q;
q.push(1);
level[1] = 0;
while(!q.empty())
{
int id = q.front();
q.pop();
if(maxLevel < level[id])
maxLevel = level[id];
if(v[id].size() == 0)
result[level[id]]++;
for(int i = 0;i < v[id].size();i++)
{
q.push(v[id][i]);
level[v[id][i]] = level[id]+1;
}
}
}