32.快乐节点

描述

思路:

这里首先可以使用一个二维数组来记录二叉树的结构,使用广度优先遍历的思路来找到全部的快乐节点,为了避免重复遍历,这里使用一个vector容器来记录已经遍历的节点,为了避免遍历的过多,使用一个变量来记录遍历的次数,当广度遍历的次数已经到达距离m的时候,就停止遍历,输出遍历到的数据节点。

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin >> n >> m ;
    // 使用二维数组保存树形结构中的数据值
    vector<vector<int>> tree(n+1,vector<int>());
    vector<bool> vis(n+1,false);
    for(int i = 1; i<n ;i++){
        int u,v;
        cin >> u >> v;
        tree[u].push_back(v);
    }

    int k,e;
    cin >> k;
    queue<int> q;

    // 记录已经访问过的节点
    for(int i = 1;i<=k ;i++){
        cin >> e;
        vis[e] = true;
        q.push(e);
    }

    // 这里用一个set保存快乐节点
    set<int> ret;
    while(!q.empty()){
        int size = q.size();
        // 这里要把特殊节点和距离不超过m的节点都保存到ret中。
        if(m == -1) break;
        while(size--){
            int pop = q.front();
            q.pop();
            ret.insert(pop);
            for(auto next : tree[pop]){
                if(!vis[next]){
                    q.push(next);
                    vis[next] = true;
                }
            }
        }
        m--;
    }
    cout << ret.size() << endl;
    for(auto val : ret){
        cout << val << " ";
    }
    return 0;
}
posted @ 2024-09-30 21:43  alone_qing  阅读(7)  评论(0)    收藏  举报