1004 Counting Leaves (30分)

梦想与她 提交于 2020-02-01 19:49:04

题目链接1004 Counting Leaves
题意:给出树的总结点个数,和非叶子结点个数,然后给出非叶子结点的孩子结点,求每层的叶子结点数。
使用邻接表储存输入的数据。
然后bfs从根结点1遍历,level++.返回最大的层数。
坑点:

  1. 数据结点值不是1-n是随机的,根节点是1。
  2. 输入的数据不一定是先输入父节点。------第一次没用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
*/


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!