PAT甲级真题 1004 Counting Leaves

一、题目
在这里插入图片描述
在这里插入图片描述
二、思路
题目给定一棵树,并要求输出树中每层叶子结点的个数。用邻接链表存储树,在遍历数组的同时,标记结点所属层数及它是否是叶子。

三、代码

#include <stdio.h>
#include <stdlib.h>

int main() {
	int N, M, i, j, m, n, l, cnt[100] = { 0 }, max;//cnt存储每层有几个叶子
	typedef struct node{
		int value;
		struct node* next;
	}nextnode;
	typedef struct {
		int nodenum;
		int seq;//所属层号
		int flag;//是否为叶子
		nextnode* link;//指向其孩子
	}treenode;
	treenode t[100];
	nextnode* s;
	scanf("%d %d", &N, &M);
	for (i = 0; i < N; i++) {//初始化数组t
		t[i].nodenum = i + 1;
		t[i].seq = 0;
		t[i].flag = 0;
		t[i].link = NULL;
	}
	for (i = 0; i < M; i++) {//读入树信息
		scanf("%2d %d", &m,&n);
		for (j = 0; j < n; j++) {
			scanf("%2d", &l);
			s = (nextnode*)malloc(sizeof(nextnode));
			s->value = l;
			s->next = t[m - 1].link;
			t[m - 1].link = s;
		}
	}
	t[0].seq = 1; //根结点属于第一层
	for (i = 0; i < N; i++) {//遍历数组t
		s = t[i].link;//判断第i个结点是否有孩子
		if (s == NULL)//若无,则为叶子
			t[i].flag = 1;
		while (s != NULL) {//若有,标记其孩子所属层数
			t[s->value - 1].seq = t[i].seq + 1;
			s = s->next;
		}
	}
	max = 1;
	for (i = 0; i < N; i++) {//再次遍历t,计算每一层有几个叶子,并计算最多有多少层
		if (t[i].flag == 1)
			cnt[t[i].seq-1]++;
		if (t[i].seq > max)
			max = t[i].seq;
	}
	for (i = 0; i < max; i++)//输出结果
		if (i < max - 1)
			printf("%d ", cnt[i]);
		else
			printf("%d", cnt[i]);
	return 0;
}

四、总结
最初想着用队列标记父子关系,不过想复杂了。邻接链表虽是在学习图的时候用的,不过这里用来也挺方便,毕竟树就是个没有回路的图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值