1、不是二叉樹,存儲方式用到了代碼中的結構體。
2、因爲結點編號在100以內,可以讓第i個結點就存儲在tree[i]中,方便查找
3、方法:建樹然後層序遍歷,遍歷時記錄layer,和當層無葉子結點的結點個數
注意:這題題目有個:The input ends with N being 0. That case must NOT be processed.
我以爲輸入的N爲0時,不進行處理,結果加不加判斷都能A,所以也不知道給這個說明是來幹嘛的,另外,題目本身就說明了N是不可能等於0的。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
struct Node{
int data;
int layer;
vector<int> child;
};
struct Node tree[100];
int n,m;
vector<int> result;
void layer(){
queue<int> q;//tree 的下標
q.push(1);
tree[1].layer = 0;
int layer =0;
int sum = 0;
while(!q.empty()){
int i = q.front();
q.pop();
if(tree[i].layer != layer){//層次切換時存儲上一層結果
layer = tree[i].layer;
result.push_back(sum);
sum=0;
}
if(tree[i].child.size() != 0){
for(int j=0;j<tree[i].child.size();j++){
int h = tree[i].child[j];
tree[h].layer = tree[i].layer+1;
q.push(h);
}
}else{
sum++;
}
}
//最後的一層
result.push_back(sum);
}
int main()
{
scanf("%d",&n);
if(n == 0) return 0;
scanf("%d",&m);
int index,num,c;
for(int i=0;i<m;i++){
scanf("%d",&index);
int num;
scanf("%d",&num);
for(int j=0;j<num;j++){
int ch;
scanf("%d",&ch);
tree[index].child.push_back(ch);
}
}
layer();
for(int i=0;i<result.size();i++){
printf("%d",result[i]);
if(i!=result.size()-1) printf(" ");
}
printf("\n");
return 0;
}