一、题目
二、思路
题目给定一棵树,并要求输出树中每层叶子结点的个数。用邻接链表存储树,在遍历数组的同时,标记结点所属层数及它是否是叶子。
三、代码
#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;
}
四、总结
最初想着用队列标记父子关系,不过想复杂了。邻接链表虽是在学习图的时候用的,不过这里用来也挺方便,毕竟树就是个没有回路的图