树的遍历 PAT 1004

来源:互联网 发布:数据库join 笛卡尔 编辑:程序博客网 时间:2024/06/11 00:07

题目地址:https://www.patest.cn/contests/pat-a-practise/1004


C语言实在有点麻烦
/*Member(Vertex):表示一个家庭成员,我使用了两个结构成员:level,表示这个人在家谱中的辈分,最高的辈分是0,辈分越低,level越大child,指向Child结构变量,即链表的第一个节点Child(Edge):表示亲子关系,也使用了两个结构成员:ID,表示这个孩子的IDiter,指向相同父母的下一个孩子Child变量*/#include #define MAX 999typedef struct Member *Member;typedef struct Child *Child;struct Member{    int level;    Child child;};struct Child{    int ID;    Child iter;};main(){    int i,k,N, M, ID, cID, K,level;    struct Member nodes[100];     //定义一个Member变量    struct Child children[100];    //定义一个Child变量,这里指针变量不需要加*是因为前面已经定义了别名,*child就是child    /* 读取数据,初始化邻接链表 */    scanf("%d %d", &N, &M);    for(i = 1; i <= N; i++)    {        nodes[i].level = MAX;        nodes[i].child = NULL;    }    nodes[1].level = 0;         /* 根节点为0 */    for(i = 0,k=0; i < M; i++)   //这么写是k只赋了一次值,k可以一直增长,若赋在第二层,则会重复赋值。    {                            //iiter)            nodes[c->ID].level+=i;    }    /*对于每一层,找到叶子结点 */    int n = N, count;    for(level = 0; n; level++)    {        count = 0;        for(i = 1; i <= N; i++)          if(nodes[i].level == level)//每层遍历          {            n--;            if(nodes[i].child == NULL)                count++;            /* set the children to next level */            Child c;            for(c = nodes[i].child; c; c = c->iter)//其实就是一个赋值,他下一层所有的孩子赋为level+1                nodes[c->ID].level = level + 1;    //一次性他的孩子全赋了          }        printf("%d%c", count, n ? ' ' : '\0');//这句相当不错啊,n没了就输出NULL    }}

粘一段C++的代码(DFS)
#include  #include  #include  #include  using namespace std;  const int maxn=1e2+10;  int n,m,k,x,f[maxn],deep,y;  vector t[maxn];    void dfs(int x,int dep)  {    deep=max(deep,dep);    if (!t[x].size()) f[dep]++;    for (int i=0;i