GESP2024年6月认证C++六级( 第三部分编程题(2)二叉树)

参考程序1:

cpp 复制代码
#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:

cpp 复制代码
#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";
}
相关推荐
天若有情6731 小时前
【数据结构】生活中的数据结构:从吃饭与编程看栈与队列思维
数据结构·生活
Tjyuking1 小时前
OS架构整理
运维·c++·缓存·架构·操作系统
程序员编程指南1 小时前
Qt 移动应用发布与分发指南
c语言·开发语言·c++·qt
x晕x1 小时前
Qt 消息弹窗 Toast
linux·c++·windows·qt·mac
刚入坑的新人编程1 小时前
暑期算法训练.11
数据结构·c++·算法·leetcode·链表
程序员编程指南1 小时前
Qt 与物联网(IoT)开发
c语言·开发语言·c++·qt·物联网
hzhzh~1 小时前
【C++】神秘-希尔排序
c++·希尔排序·排序·sort
秋风起,再归来~1 小时前
C++从入门到起飞之——智能指针!
开发语言·c++·算法
MingYue_SSS1 小时前
【未解决】STM32无刷电机驱动电路问题记录
笔记·嵌入式硬件·学习
十五年专注C++开发1 小时前
MakeInstaller: 一款麒麟操作系统安装包制作工具
linux·c++·打包工具·安装包制作·麒麟系统