Skip to content

Counting Leaves

题目链接1004 Counting Leaves (30 分)

题干大意

输出树的叶节点个数。

思路

用BFS也就是层序遍历

问题

一些迭代器、索引的问题,还是写注释要好,思路清晰,不会乱

AC代码

C++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int traverse(vector<vector<int>> nodes, vector<int>& cnt)
{
    queue<int> Q;
    Q.push(1);
    int         layer = 1;
    vector<int> num;
    num.push_back(nodes[1].size());
    while (!Q.empty()) {
        int  size = int(num.size());
        auto p    = Q.front();
        for (int i = 0; i < size; ++i) { // num.size()为孩子个数
            if (nodes[p].empty())
                ++cnt[layer];
            ++p;
        }
        num.clear();
        for (int i = 0; i < size; ++i) {
            auto q = Q.front();
            Q.pop();
            if (!nodes[q].empty()) {
                for (auto it = nodes[q].begin(); it != nodes[q].end(); ++it) {
                    Q.push(*it);
                    num.push_back(nodes[*it].size());
                }
            }
        }
        ++layer;
    }
    return --layer;
}
int main()
{
    int N, M;
    cin >> N >> M;
    vector<vector<int>> nodes(N + 1);
    for (int i = 0; i != M; ++i) {
        int parent, K, child;
        cin >> parent >> K;
        for (int j = 0; j < K; ++j) {
            cin >> child;
            nodes[parent].push_back(child);
        }
    }
    vector<int> cnt(N + 1, 0);
    auto        layer = traverse(nodes, cnt);
    for (auto i = 1; i <= layer; ++i) {
        cout << cnt[i];
        if (i != layer)
            cout << " ";
    }
    return 0;
}