GESP2024年6月认证C++六级( 第三部分编程题(2)二叉树)
参考程序1:
#include <iostream>
#include <vector>
using namespace std;
void dfs(int node, const vector<vector<int>>& tree, vector<int>& colors, vector<int>& flip_count, int flip) {
// 反转当前节点的颜色
flip ^= flip_count[node];
colors[node] = (colors[node] + flip) % 2;
// 遍历当前节点的所有子节点
for (int child : tree[node]) {
dfs(child, tree, colors, flip_count, flip);
}
}
int main() {
int n;
cin >> n;
// 构建树
vector<vector<int>> tree(n);
vector<int> parent(n, -1); // parent[i] 存储节点i的父节点
for (int i = 1; i < n; ++i) {
int p;
cin >> p;
parent[i] = p - 1; // -1是因为题目中的节点编号从1开始,C++数组从0开始
tree[p - 1].push_back(i);
}
// 读取节点颜色信息
string colors_str;
cin >> colors_str;
vector<int> colors(n);
for (int i = 0; i < n; ++i) {
colors[i] = colors_str[i] - '0';
}
// 读取操作次数
int q;
cin >> q;
// 记录反转操作的次数
vector<int> flip_count(n, 0);
for (int i = 0; i < q; ++i) {
int a;
cin >> a;
flip_count[a - 1] ^= 1; // 标记节点a的颜色需要反转
}
// 初始化 DFS 过程
dfs(0, tree, colors, flip_count, 0);
// 输出最终的节点颜色
for (int i = 0; i < n; ++i) {
cout << colors[i];
}
cout << endl;
return 0;
}
参考程序2:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n;
int son[N][2];
int f[N],col[N],sum[N];
void dfs(int x,int now)
{
now+=sum[x];
if(now&1)col[x]^=1;
for(int i=0;i<2;i++)
{
if(son[x][i]!=-1)
dfs(son[x][i],now);
}
}
int main()
{
cin>>n;
memset(son,-1,sizeof son);
for(int i=2;i<=n;i++)
{
cin>>f[i];
for(int j=0;j<2;j++)
{
if(son[f[i]][j]==-1)
{
son[f[i]][j]=i;
break;
}
}
}
string s;
cin>>s;
for(int i=1;i<=n;i++)
{
col[i]=s[i-1]-'0';
}
int q;
cin>>q;
while(q--)
{
int x;
cin>>x;
sum[x]+=1;
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
cout<<col[i];
}
cout<<"\n";
}