考察树的层次遍历,使用数组保存每个节点的孩子节点,在判断时不太方便。使用vector更方便对孩子节点的操作。笔者使用的是队列的方式来层次遍历,另一种可参考的方式是递归的深度遍历。
笔者代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 101
int main(){
int n,m,k,i,id,j;
int child[N][N];
memset(child,-1,sizeof(child));
scanf("%d %d",&n,&m);
for(i =0;i<m;i++){
scanf("%d %d",&id,&k);
for(j=0;j<k;j++){
scanf("%d",&child[id][j]);
}
}
int nochild[N];
memset(nochild,0,sizeof(nochild));
int level=1;
id =1;
queue<int> que ;
que.push(id);
int len = 1;
while(!que.empty()){
id = que.front();
que.pop();
len--;
i=0;
if(child[id][i]==-1){
nochild[level]++;
}
else while(child[id][i]!=-1){
que.push(child[id][i]);
i++;
}
if(len==0){
level++;
len = que.size();
}
}
bool flag = true;
for(i=1;i<level;i++){
if(flag){
flag = false;
}
else{
printf(" ");
}
printf("%d",nochild[i]);
}
}
递归深度遍历的方法:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
map<int,vector<int> >adjlist;
int record[101]={0};
void DFS(int id,int level){
if(adjlist[id].empty()){
++record[level];
return;
}
vector<int>::iterator ite = adjlist[id].begin();
for(;ite!=adjlist[id].end();++ite){
DFS(*ite,level+1);
}
}
int main(){
//freopen("in.txt","r",stdin);
int n,m,id,k,sid,i,cle,cnt;
scanf("%d %d",&n,&m);
cle = n-m;
while(m--){
scanf("%d %d",&id,&k);
while(k--){
scanf("%d",&sid);
adjlist[id].push_back(sid);
}
}
DFS(1,0);
printf("%d",record[0]);
cnt = record[0];
for(i=1;cnt<cle;++i){
printf(" %d",record[i]);
cnt += record[i];
}
printf("\n");
return 0;
}