pat甲级1004 Counting Leaves

题意:给你一棵有n个节点的树,其中有m个节点是非叶节点,剩下输入m行,每一行代表一个非叶节点的信息,分别是该非叶节点的序号,有k个孩子,每个孩子节点的序号。要求这棵树每一层有多少个叶子节点。

分析:数据结构基础题,数据量不大,节点数在100以内,但是一定不能构造一棵满二叉树来做,有可能这棵树退化成一条链,这样就需要2^100-1个节点来构造,内存必爆炸,看挺多人用bfs/dfs做,我用的结构体数组模拟了一下即可。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 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 }
原文地址:https://www.cnblogs.com/wade1998/p/13443045.html