题目链接
题目描述:寻找树的每层叶子节点个数
整体思路:
1.使用bfs遍历整个树,通过遍历树的每一层,将每一层的叶子节点记录,最后输出。
2.通过dfs搜索叶子节点
conclusion:搜索遍历树
代码思路:
1.通过队列处理每一层的node.
注意事项:
根节点是从01开始的.
bfs代码(c/c++)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
queue<int> Tnode;
int node[110][110];//节点
int result[110];//存每层叶子节点的个数
int main()
{
int n,m;cin>>n>>m;
int id,k;
for(int i=0;i<m;i++){
cin>>id>>k;
for(int j=0;j<k;j++){
cin>>node[id][j];//id是当前节点的id,node[id][j]是该节点第j个孩子的id.
}
}
Tnode.push(1);
int step=0;
while(!Tnode.empty()){//遍历树
int sz=Tnode.size();
int cnt=0;
for(int i=0;i<sz;i++){//遍历一层
int ft=Tnode.front();
Tnode.pop();
int tmp=0;
if(node[ft][0]==0){cnt++;}//have no child
else{
while(node[ft][tmp]!=0){//have childs
Tnode.push(node[ft][tmp]);
tmp++;
}
}
}
result[step]=cnt;
step++;
}
for(int i=0;i<step-1;i++){
printf("%d ",result[i]);
}
printf("%d",result[step-1]);
}
dfs代码(c/c++)
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
vector<int> v[110];
int maxdepth=-1;
int ans[110];
void dfs(int index,int depth)//深搜
{
if(v[index].size()==0){
ans[depth]++;
maxdepth=max(maxdepth,depth);
return ;
}
for(int i=0;i<v[index].size();i++){
dfs(v[index][i],depth+1);
}
}
int main()
{
int n,m;cin>>n>>m;
int id,k,c;
for(int i=0;i<m;i++){
cin>>id>>k;
for(int j=0;j<k;j++){
cin>>c;
v[id].push_back(c);
}
}
dfs(1,0);
for(int i=0;i<maxdepth;i++){
cout<<ans[i]<<" ";
}
cout<<ans[maxdepth]<<endl;
}