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