1004 Counting Leaves
阿新 • • 發佈:2020-08-05
題意:給你一棵有n個節點的樹,其中有m個節點是非葉節點,剩下輸入m行,每一行代表一個非葉節點的資訊,分別是該非葉節點的序號,有k個孩子,每個孩子節點的序號。要求這棵樹每一層有多少個葉子節點。
分析:資料結構基礎題,資料量不大,節點數在100以內,但是一定不能構造一棵滿二叉樹來做,有可能這棵樹退化成一條鏈,這樣就需要2^100-1個節點來構造,記憶體必爆炸,看挺多人用bfs/dfs做,我用的結構體陣列模擬了一下即可。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespacestd; 5 struct node 6 { 7 int father,level,child; 8 }a[110]; 9 int level[110]; 10 int main() 11 { 12 ios::sync_with_stdio(false); 13 cin.tie(0); 14 cout.tie(0); 15 int n,m; 16 while(cin>>n>>m) 17 { 18 memset(a,0,sizeof(a)); 19 memset(level,0,sizeof(level)); 20 int id,k,child_id; 21 int max_level=1;//這裡著重說明一下如果不像特別處理的話初始化為1比較好,有一個樣例一直不過是因為我一開始初始化-1,後來發現如果只有一個節點的話,這個變數無法在下面更新,就會出錯。 22 for(int i=0;i<m;i++) 23 { 24 cin>>id>>k; 25 a[id].child=1;//id這個節點有孩子 26 for(int j=0;j<k;j++)27 { 28 cin>>child_id; 29 a[child_id].father=id; 30 } 31 } 32 a[1].level=1;//設定根節點在第一層 33 for(int i=1;i<=n;i++) 34 { 35 for(int j=1;j<=n;j++) 36 { 37 if(a[j].father==i) 38 { 39 a[j].level=a[a[j].father].level+1; 40 if(a[j].level>max_level) 41 { 42 max_level=a[j].level; 43 } 44 } 45 } 46 } 47 for(int i=1;i<=n;i++) 48 { 49 if(a[i].child==0)//統計每一層有多少個葉節點 50 { 51 level[a[i].level]++; 52 } 53 } 54 for(int i=1;i<max_level;i++) 55 { 56 cout<<level[i]<<" "; 57 } 58 cout<<level[max_level]<<endl; 59 } 60 return 0; 61 }