树结构练习——判断给定森林中有多少棵树

Problem Description

众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东 西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来了很多困难。为此,在java语言中,只允许单继承结构,并采用接口 来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常感兴趣。这份java代码是由n个类组成的(本题不考虑接口),n个类分别用数字1..n表示。现在给你n个类之间的关系,有q次询问,每次询问某一个有多少个直接继承的子类。输入子类的个数和标号(标号按照字典序大小输出)。

Input

首先输入一个整数T,表示数据的组数。每组数据格式如下。
第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系(1<=m

#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct node
{
    int data;
    struct node *l, *r;
}tree;
tree *tr[100010];  //多棵树
int f, a[100010];  //f用来方便控制输出空格,数组a储存树i的节点个数
tree *Creat(tree *t, int k);  //把元素k,以创建二叉树的方式建立
void mid(tree *t);  //中序输出树
int main()
{
    int test;
    scanf("%d", &test);  //测试输入的组数
    while(test--){
        int i, n, m;
        memset(a, 0, sizeof(a));
        scanf("%d %d", &n, &m); 
        for(i = 0; i <= n; i++)  //不能省!!!相当于初始化每棵树为空数
            tr[i] = NULL;
        int x, y;
        for(i = 0; i < m; i++){
            scanf("%d %d", &x, &y);  //注意读题X、Y的含义,否则就容易把Y当做要插入的节点
            a[y]++;  //树Y的节点个数+1
            tr[y] = Creat(tr[y], x);  //建立二叉树
        }
        int num;
        scanf("%d", &num);  //num个询问
        int k;
        for(i = 0; i < num; i++){
            scanf("%d", &k);
            if(a[k] != 0){
                printf("%d\n", a[k]);
                f = 0;
                mid(tr[k]);
                printf("\n");
            }
            else printf("0\n");
        }
    }
    return 0;
}
tree *Creat(tree *t, int k)
{
    if(t == NULL){
        tree *p = (tree *)malloc(sizeof(tree));
        p->data = k;
        p->l = p->r = NULL;
        t = p;
    }
    else{
        if(t->data > k)
            t->l = Creat(t->l, k);
        else if(t->data < k)
            t->r = Creat(t->r, k);
    }
    return t;
}
void mid(tree *t)
{
    if(t){
        mid(t->l);
        if(f == 0){   //如果是“第一个”节点则直接输出(无空格)
            printf("%d", t->data); 
            f++;
        }
        else printf(" %d", t->data);
        mid(t->r);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值