原題鏈接
解題思路
這道題目是求樹的每一層上的葉子節點個數。
整一個leaf[]數組記錄每一層的結點個數
DFS或者BFS樹,在遍歷過程中記錄結點的層數(或者說高度),如果該結點爲葉子節點,就把該層次(深度)的leaf值++。
我寫DFS和BFS的習慣這幾題可以看出是一模一樣的,DFS中把結點的層次或者深度作爲參數傳遞,BFS把層數或者深度作爲結點結構體中的成員變量。找到自己喜歡的寫法就好了。
源代碼
BFS
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=110;
struct node{
int depth;
vector<int> child;
}tree[maxn];
int n,m;
int cnt[maxn];
int maxDepth = 0;
void BFS(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int top = q.front();
q.pop();
if(tree[top].depth > maxDepth){
maxDepth = tree[top].depth;
}
if(tree[top].child.size() == 0){
cnt[tree[top].depth] ++;
}
for(int i=0; i<tree[top].child.size(); i++){
int child = tree[top].child[i];
tree[child].depth = tree[top].depth+1;
q.push(child);
}
}
}
int main(){
fill(cnt, cnt+maxn, 0);
scanf("%d%d",&n,&m);
if(n==0)
return 0;
int father, num, child;
for(int i=0; i<m; i++){
scanf("%d%d",&father,&num);
for(int j=0; j<num; j++){
scanf("%d",&child);
tree[father].child.push_back(child);
}
}
tree[1].depth = 1;
BFS(1);
for(int i=1; i<=maxDepth; i++)
{
printf("%d",cnt[i]);
if(i<maxDepth)
printf(" ");
}
return 0;
}
DFS
#include<iostream>
#include<vector>
using namespace std;
const int maxn=110;
vector<int> tree[maxn];
int n,m;
int cnt[maxn];
int maxDepth = 0;
void DFS(int index, int depth)//當前結點編號和深度
{
if(tree[index].size()==0)
{
cnt[depth]++;
if(depth>maxDepth)
maxDepth=depth;
}
for(int i=0; i<tree[index].size(); i++)
{
int child=tree[index][i];
DFS(child,depth+1);
}
}
int main()
{
fill(cnt, cnt+maxn, 0);
scanf("%d%d",&n,&m);
if(n==0)
return 0;
int father, num, child;
for(int i=0; i<m; i++)
{
scanf("%d%d",&father,&num);
for(int j=0; j<num; j++)
{
scanf("%d",&child);
tree[father].push_back(child);
}
}
DFS(1,1);
for(int i=1; i<=maxDepth; i++)
{
printf("%d",cnt[i]);
if(i<maxDepth)
printf(" ");
}
return 0;
}