版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37407587/article/details/83348533
题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184
解题思路与代码实现
思路1:
构建一个结构体,包含三个元素,id,是否有孩子, 层级
构建一个数组维护树结构
读取元素以及其孩子,对其孩子id对应的数组位置的level进行更新,为本节点+1
读取完数据后, 按照level对数组遍历, 对!has_child的本level进行累加
遇到的问题:
-
如何将01这样的两位编号合适的转化为int类型
读取一个char[3]的数组用atoi(char*) 函数转为int
如果只是使用int值, 直接用int变量去接收cin的传参,如果希望使用char和int, 则按照上面的方法 -
打乱ID的顺序, 例如儿子在双亲前, 会导致level错误(此时双亲的level为0)
测试点1,3相关 -
对ID不连续敏感,但题目并没有保证ID的连续性(通过加used并没有减少未通过项,证明不是连续敏感的问题)
可能的解决办法: 先建树再计层数
思路2:
1 3 测试点过不去, 问题最可能出现在2上,若给定顺序不一样
先将节点信息存起来, 再从根开始向下找,这就是为什么网上的一些代码是使用DFS或BFS的构建一个结构体, 存储节点的子节点
从根节点按照DFS遍历树
/***********************************
思路1 测试点1 3 过不去
************************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node {
bool has_child;
int level;
bool used;
};
int main()
{
int N, M, tree_level = 0;
cin >> N;
if (N == 0) return 0;
cin >> M;
vector<Node> tree(N + 1); // tree[0] is abondon.
for (int i = 0; i < tree.size(); i++) {
tree[i].has_child = false;
tree[i].used = false;
}
tree[1].level = 0;
tree[1].used = 1;
for (int i = 0; i < M; i++) {
int k;
int ID;
cin >> ID >> k;
int parent = ID;
tree[parent].has_child = true;
for (int j = 0; j < k; j++) {
int temp;
cin >> temp;
tree[temp].level = tree[parent].level + 1;
tree[temp].used =true;
tree_level = tree[parent].level + 1;
}
}
// brute force method.
for (int i = 0; i <= tree_level; i++) {
int cnt = 0;
for (auto p = ++tree.begin(); p != tree.end(); p++) {
if (p->level == i && p->used && !p->has_child) cnt++;
}
if (i != tree_level) cout << cnt << " ";
else cout << cnt;
}
getchar();
getchar();
return 0;
}
/*********************************
思路2 存储所有信息并通过DFS计数每层叶子节点
**********************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Node {
vector<int> childs;
};
int layer_counter[100] = {0};
int maxlayer = 0;
void DFS(int index, int layer, Node* node) {
maxlayer = max(layer, maxlayer); // update maxlayer
if (node[index].childs.size() == 0) {
layer_counter[layer]++;
return ;
}
for (int i = 0; i < node[index].childs.size(); i++) {
DFS(node[index].childs[i], layer + 1, node);
}
}
int main(void)
{
int M, N;
cin >> N;
if (!N) return 0;
Node *node = new Node[N+1];
cin >> M;
// for(int i = 0; i< 100; i++)
// node[i].layer = 0;
while(M--) {
int id, k;
cin >> id >> k;
while (k--) {
int child;
cin >> child;
node[id].childs.push_back(child);
}
}
DFS(1, 0, node);
for (int i = 0; i <= maxlayer; i++) {
if (i != maxlayer)
cout << layer_counter[i] << " ";
else
cout << layer_counter[i];
}
getchar();
getchar();
return 0;
}