就是一个普通的常规题目,就是给你一棵树,求出树的每一层叶子节点的数量。 注意输出,末尾没有空格,可以参考一下日沉云起大神的题解,他就是处理边界,输入输出上,写代码的风格非常棒,真的十分值得借鉴呀。 可能底下的题解有别于《算法笔记》上面的题解,但是总体上还是相同的,使用邻接表去模拟树。关于这里邻接表的表示,可以参考我博客里面,链表那一章节的博客。希望看看呀,有问题的可以评论。
#include <iostream> #include <algorithm> #include <string.h> using namespace std; const int N=110; int h[N],e[N],ne[N],idx,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){ //如果尾部节点已经到-1了。说明就是叶子节点 if(h[u]==-1){ 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(){ int n,m; 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]; for(int i=0;i<=max_depth;i++) cout<<(i==0?"":" ")<<cnt[i]; return 0; }