题目链接1004 Counting Leaves
题意:给出树的总结点个数,和非叶子结点个数,然后给出非叶子结点的孩子结点,求每层的叶子结点数。
使用邻接表储存输入的数据。
然后bfs从根结点1遍历,level++.返回最大的层数。
坑点:
- 数据结点值不是1-n是随机的,根节点是1。
- 输入的数据不一定是先输入父节点。------第一次没用BFS直接输入数据的时候处理的,没有想到这种情况,搜了几个博客看到了自己的错误所在。博客地址
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
const int maxn = 110;
typedef struct Tree{
int val;
int high;
Tree (int value, int h) {
val = value;
high = h;
}
}Tree;
vector<Tree> v[maxn];
int bfs ();
int main(int argc, char** argv) {
int n, m, k;
scanf("%d%d", &n, &m);
if (n == 0) {
printf("0\n");
return 0;
}
// 初始化
for (int i = 1; i <= maxn; i++) { // 加入头结点
Tree t = Tree(i, 0);
v[i].push_back(t);
}
v[1][0].high = 1;
for (int i = 0; i < m; i++) {
int x, t;
scanf("%d%d", &x, &k);
for (int j = 0; j < k; j++) {
scanf("%d", &t);
Tree node = Tree(t, 0);
v[x].push_back(node);
}
}
int maxHigh = bfs();
int level[maxn] = {0};
for (int i = 1; i <= maxn; i++) { // 只有头结点且是输入数据的结点值为叶子结点
if (v[i].size() == 1 && v[i][0].high != 0) {
level[v[i][0].high]++;
}
}
for (int i = 1; i <= maxHigh; i++) {
if (i == 1)
printf("%d", level[i]);
else
printf(" %d", level[i]);
}
return 0;
}
int bfs () {
queue<int> que;
que.push(1);
int maxHigh = 1;
while (!que.empty()) {
int x = que.front();
que.pop();
int curHigh = v[x][0].high + 1;
if (curHigh > maxHigh)
maxHigh = curHigh;
for (int i = 1; i < v[x].size(); i++) {
int data = v[x][i].val;
v[data][0].high = curHigh;
que.push(data);
}
}
return maxHigh - 1; // 因为最后出的是最后一层的叶子结点,curHigh求的是结点的下一层
}
/**
11 5
5 2 10 7
1 3 5 3 4
3 1 9
10 1 2
9 3 11 12 13
*/
来源:CSDN
作者:qq_37866436
链接:https://blog.csdn.net/qq_37866436/article/details/104136545