1004 Counting Leaves (30 分)c++实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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进行累加

遇到的问题:

  1. 如何将01这样的两位编号合适的转化为int类型
    读取一个char[3]的数组用atoi(char*) 函数转为int
    如果只是使用int值, 直接用int变量去接收cin的传参,如果希望使用char和int, 则按照上面的方法

  2. 打乱ID的顺序, 例如儿子在双亲前, 会导致level错误(此时双亲的level为0)
    测试点1,3相关

  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;
}

猜你喜欢

转载自blog.csdn.net/m0_37407587/article/details/83348533
今日推荐