首页 > 其他分享 >二叉树

二叉树

时间:2025-01-04 21:04:31浏览次数:3  
标签:颜色 int 二叉树 编号 节点 105

描述

小杨有⼀棵包含 n 个节点的二叉树,且根节点的编号为 1。这棵二叉树任意⼀个节点要么是白色,要么是黑色。之后小杨会对这棵二叉树进行 q 次操作,每次小杨会选择⼀个节点,将以这个节点为根的子树内所有节点的颜色反转,即黑色变成白色,白色变成黑色。

小杨想知道 q 次操作全部完成之后每个节点的颜色。

输入描述

第⼀行一个正整数 n,表示二叉树的节点数量。

第二行 (n−1) 个正整数,第 i(1≤i≤n−1)个数表示编号为 (i+1) 的节点的父亲节点编号,数据保证是⼀棵二叉树。

第三行一个长度为 n 的 01 串,从左到右第 i(1≤i≤n)位如果为 0,表示编号为 i 的节点颜色为白色,否则为黑色。

第四行⼀个正整数 q,表示操作次数。

接下来 q 行每行⼀个正整数 ai​(1≤ai​≤n),表示第 i 次操作选择的节点编号。

输出描述

输出一行一个长度为 n 的 01 串,表示 q 次操作全部完成之后每个节点的颜色。从左到右第 i(1≤i≤n) 位如果为 0,表示编号为 i 的节点颜色为白色,否则为黑色。

样例输入 1 

6
3 1 1 3 4
100101
3
1
3
2

样例输出 1 

010000

提示

样例解释

第一次操作后,节点颜色为:011010

第二次操作后,节点颜色为:000000

第三次操作后,节点颜色为:010000

数据范围
子任务编号得分nq特殊条件
120≤105≤105对于所有 i≥2,节点 i 的父亲节点编号为 i−1
240≤1000≤1000
340≤105≤105

对于全部数据,保证有 n,q≤105。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct nod{
    char date;
    int fa,lc,rc,num;
}a[N];
int n,k,T,m,dp[N];
void fun(int x){
    if(x==0) return ;
    dp[x]=dp[a[x].fa]+a[x].num;
    fun(a[x].lc);
    fun(a[x].rc);
}
int main(){
    cin>>n;
    for(int i=2;i<=n;i++){
        cin>>k;
        a[i].fa=k;
        if(a[k].lc==0) a[k].lc=i;
        else a[k].rc=i;       
    }
    for(int i=1;i<=n;i++){
        cin>>a[i].date;
    }
    cin>>T;
    while(T--){
        cin>>m;
        a[m].num++;
    }
    fun(1);
    for(int i=1;i<=n;i++){
        if(dp[i]%2==0) cout<<a[i].date;
        else cout<<1-(a[i].date-'0');
    }
}

标签:颜色,int,二叉树,编号,节点,105
From: https://blog.csdn.net/2401_86852582/article/details/144934948

相关文章

  • LeetCode算法题 (二叉树的直径)Day11!!!C/C++
    https://leetcode.cn/problems/diameter-of-binary-tree/description/一、题目描述给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它......
  • 124.二叉树中的最大路径和
    /***@param{TreeNode}root*@return{number}*///子树的最大路径和=左子树提供的最大路径和+根节点值+右子树的的最大路径和,//分别递归遍历左子树和右子树的最大路径和,两者之前取一个最大值;返回;//最后里面,要注意最后得出的是一个负数,直接返回0;否则正常的数据......
  • 编程题-二叉树的中序遍历
    题目:给定一个二叉树的根节点root,返回它的中序 遍历。解答一(递归):首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的......
  • 树形DP学习笔记(二):打家劫舍III & 监控二叉树
    参考:树形DP:打家劫舍III【基础算法精讲24】_哔哩哔哩_bilibili树形DP:监控二叉树【基础算法精讲25】_哔哩哔哩_bilibilips:笔记中的代码按本人理解整理,重思路,对比原视频中的代码稍有改动往期:树形DP学习笔记(一):树的路径问题-CSDN博客状态机DP学习笔记-CSDN博客【如果笔记......
  • 1367. 二叉树中的链表
    给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。一直向下的路径的意思是:从树中某个节点开始,一直连续向......
  • 【Leecode】Leecode刷题之路第94天之二叉树的中序遍历
    题目出处94-二叉树的中序遍历-题目出处题目描述个人解法思路:todo代码示例:(Java)todo复杂度分析todo官方解法94-二叉树的中序遍历-官方解法方法1:递归思路:代码示例:(Java)classTreeNode{intval;TreeNodeleft;TreeNoderight;......
  • LeetCode110平衡二叉树
    原理本题判断一个二叉树是否为平衡二叉树,核心思路是基于平衡二叉树的定义,即任意节点的左右子树的高度差的绝对值不超过1。通过递归地计算每个节点为根的子树的高度,在计算过程中判断是否满足高度差条件,如果发现某个节点的左右子树高度差超过1,则整棵树不是平衡二叉树,标记为特......
  • 最早发明的自平衡二叉树:AVL
    前言更好的阅读体验默认读者会基本的BST操作。节点定义平衡因子:BF(BalanceFactor),左子树高\(-\)右子树高。平衡树是让树的形态尽可能像完全二叉树,而不是链。在AVL中,我们认为\(\left|\text{BF}\right|\le1\),也就是BF为\(0,1,-1\)时的子树是平衡的,否则就是不平衡......
  • 【数据结构】二叉树
    二叉树1.树型结构(了解)1.1概念1.2概念(重要)1.3树的表示形式(了解)1.4树的应用2.二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1前置说明2.5.2二叉树的遍历2.5.3二叉树的基本操作2.6二叉树相关oj题【本节......
  • 二叉树中的最大路径和(递归)
    二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。 示例......