【天梯选拔月赛】二叉树上我和你(中序+先序建树+bfs(队列)----水题)
题目:
给出一个n个结点的二叉树的前序和中序遍历,初始权值为0,有如下3个操作分别
1 x val
2 x val
3 x
分别代表 x的子树的权值都加val包括x。
根到x上的结点都减val包括x。
输出层次x的结点权值总和。不存在该层的话输出-1
输入格式:
第一行一个n,第二行和第三行分别是前序和中序遍历,接下来为m个操作。1≤n≤30,−100≤val≤100
输出格式:
对于询问3的输出结果。
输入样例:
3
2 1 3
1 2 3
3
1 2 1
2 1 10
3 1
输出样例:
9
解题思路:
中序+先序建树,bfs确定父亲结点和level,按操作add或者sub
ac代码:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 50
#define inf 0x3fffffff
using namespace std;
typedef long long ll;
int pre[maxn],in[maxn],level[maxn],l[maxn],r[maxn],p[maxn],nodeval[maxn];
int build(int l1,int r1,int l2,int r2)
{if(l1>r1) return 0;int root=pre[l1];int p=0;while(in[p]!=root) p++;int len=p-l2;l[root]=build(l1+1,l1+len,l2,l2+len-1);r[root]=build(l1+len+1,r1,p+1,r2);return root;
}
int search(int root)
{int max_level=0;queue<int> q;q.push(root);p[root]=-1;level[root]=1;while(!q.empty()){int x=q.front();q.pop();if(l[x]){q.push(l[x]);level[l[x]]=level[x]+1;p[l[x]]=x;max_level=level[l[x]];}if(r[x]){q.push(r[x]);level[r[x]]=level[x]+1;p[r[x]]=x;max_level=level[r[x]];}}return max_level;
}
void Add(int x,int val)
{if(x){nodeval[x]+=val;if(l[x]) Add(l[x],val);if(r[x]) Add(r[x],val);}
}
void Sub(int x,int val)
{if(x!=-1){nodeval[x]-=val;Sub(p[x],val);}
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int n,m;scanf("%d",&n);memset(l,-1,sizeof(l));memset(r,-1, sizeof(r));memset(nodeval,0, sizeof(nodeval));memset(level,0, sizeof(level));for(int i=0;i<n;i++)scanf("%d",&pre[i]);for(int i=0;i<n;i++)scanf("%d",&in[i]);build(0,n-1,0,n-1);int maxl=search(pre[0]);//for(int i=1;i<=n;i++)// cout<<p[i]<<" "<<level[i]<<endl;scanf("%d",&m);int op,x,val;for(int i=0;i<m;i++){scanf("%d %d",&op,&x);if(op!=3) scanf("%d",&val);if(op==1)Add(x,val);if(op==2)Sub(x,val);if(op==3) {if (x <= 0 || x > maxl)printf("-1\n");else {int sum = 0;for (int j = 1; j <= n; j++)if (level[j] == x)sum += nodeval[j];printf("%d\n",sum);}}}return 0;
}
【天梯选拔月赛】二叉树上我和你(中序+先序建树+bfs(队列)----水题)相关推荐
- 二叉树遍历方法——前、中、后序遍历(图解)
目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...
- Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)
目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...
- 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
1. 题目描述 /**请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /**1.只要pRoot.left和pRo ...
- 天梯选拔:先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数
思路分析: 这道题考察二叉树的建立以及二叉树的前序遍历.中序遍历和后序遍历.首先按照先序建立二叉树.在这期间需要先建立一个结构体,包括当前节点的值,以及它的左儿子和右儿子.注意这里不能直接存左儿子和右 ...
- 求二叉树上结点的路径_剑指offer 二叉树
二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...
- 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)
题目: 给定一颗二叉树,找到二叉树上任意两个节点之间的距离 class TreeNode {TreeNode left;TreeNode right;} 思路: 首先找到一个节点的路径,然后找到另一个 ...
- 小蚂蚁学习数据结构(26)——题目——输出二叉树上值大于x的算法
2019独角兽企业重金招聘Python工程师标准>>> 题目要求: 设二叉树以二叉链表的形式存储,有关类型定义如下: typedef struct BiTNode{ int data ...
- 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m0)个叶子结点,那么该二叉树上的结点总数为( )。
设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树.假如一棵这样的二叉树中有m(m>0)个叶子结点,那么该二叉树上的结点总数为( ). 正确答案: B 你的答案: B (正确) ...
- 捉急.. 挂在二叉树上下不来了
大家好,我是OnlyCoding 今天我有一些事情要和大家说说 很多人问你每天有那么多时间去学习.去整理这些东西吗? 说真的,没有 其实每天写公众号花费时间最多的地方就是格式整理,一整理就是好几个小时 ...
- CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决
CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决 来源:https://buuoj.cn/ 内容: 附 ...
最新文章
- 使用PHPExcel判别和格式化Excel中的日期格式
- 在 Visual C++ 中使用内联汇编
- Github Star 8.4K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
- Zookeeper和etcd比较
- python中a* b是什么意思_Python中的a+=b和a=a+b之间的区别是什么?
- UVA10751 Chessboard【数学水题】
- Qt入门使用Qt编写程序详细全过程
- 数学建模论文题目优选专业题目128个
- VB.net Socket Udp收、发数据包示例源码
- android webview 清除缓存,Android webView 缓存处理
- C#,卡特兰数(Catalan number,明安图数)的算法源代码
- 软件测试面试——常见的面试问题总结(大全)
- Linux下rsh服务配置
- 使用Visual Studio怎样制作登录界面
- 影视动画设计有些SCI期刊推荐? - 易智编译EaseEditing
- Live800:教育行业新拐点,在线客服系统如何提供价值?
- 解读谷歌财报:17亿美元罚款致利润缩减,流量成本激增已迎来下行拐点
- 图片转文字软件哪个好用?建议收藏这几款软件
- 揭阳学计算机的好学校,揭阳中学排名前十名,2021年揭阳中学排名一览表
- 失物招领|基于Web的校园失物招领系统的设计与实现
热门文章
- python中的filter函数
- autoit选中图标无反应_ps图标教学,使用小技巧。
- 如何用python创建文件_终于明了python如何创建文件
- fastcopy会损坏硬盘_绚丽多彩 卓有不凡 三星移动固态硬盘T5金属红新品评测
- qt 按钮 gradient_少造轮子!推荐一个Qt的Python组件库
- 一天学习一点之如何安装nodejs
- LeetCode 981.基于时间的键值存储(C++)
- Apache JMeter 5.1.1 发布,压力测试工具
- IntelliJ IDEA安装lombok
- 大数据时代,CRM帮助企业进行升级转型