树的遍历 PAT 1004

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


C语言实在有点麻烦
/*
Member(Vertex):表示一个家庭成员,我使用了两个结构成员:
level,表示这个人在家谱中的辈分,最高的辈分是0,辈分越低,level越大
child,指向Child结构变量,即链表的第一个节点
Child(Edge):表示亲子关系,也使用了两个结构成员:
ID,表示这个孩子的ID
iter,指向相同父母的下一个孩子Child变量
*/
#include 
   
   
    
    

#define MAX 999

typedef 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可以一直增长,若赋在第二层,则会重复赋值。
    {                            //i
    
    
     
     iter)
            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 
          
        
       
       
      
      
     
     
    
    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值