题目:


给出一个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. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

  2. Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)

    目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...

  3. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /**请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /**1.只要pRoot.left和pRo ...

  4. 天梯选拔:先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数

    思路分析: 这道题考察二叉树的建立以及二叉树的前序遍历.中序遍历和后序遍历.首先按照先序建立二叉树.在这期间需要先建立一个结构体,包括当前节点的值,以及它的左儿子和右儿子.注意这里不能直接存左儿子和右 ...

  5. 求二叉树上结点的路径_剑指offer 二叉树

    二叉树的镜像(简单) 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 根节点左右节点调换位置 递归 注意判断空子树情况 二叉树的深度(简单) 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经 ...

  6. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)

    题目: 给定一颗二叉树,找到二叉树上任意两个节点之间的距离 class TreeNode {TreeNode left;TreeNode right;} 思路: 首先找到一个节点的路径,然后找到另一个 ...

  7. 小蚂蚁学习数据结构(26)——题目——输出二叉树上值大于x的算法

    2019独角兽企业重金招聘Python工程师标准>>> 题目要求: 设二叉树以二叉链表的形式存储,有关类型定义如下: typedef struct BiTNode{ int data ...

  8. 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m0)个叶子结点,那么该二叉树上的结点总数为( )。

    设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树.假如一棵这样的二叉树中有m(m>0)个叶子结点,那么该二叉树上的结点总数为( ). 正确答案: B   你的答案: B (正确) ...

  9. 捉急.. 挂在二叉树上下不来了

    大家好,我是OnlyCoding 今天我有一些事情要和大家说说 很多人问你每天有那么多时间去学习.去整理这些东西吗? 说真的,没有 其实每天写公众号花费时间最多的地方就是格式整理,一整理就是好几个小时 ...

  10. CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决

    CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决 来源:https://buuoj.cn/ 内容: 附 ...

最新文章

  1. 使用PHPExcel判别和格式化Excel中的日期格式
  2. 在 Visual C++ 中使用内联汇编
  3. Github Star 8.4K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
  4. Zookeeper和etcd比较
  5. python中a* b是什么意思_Python中的a+=b和a=a+b之间的区别是什么?
  6. UVA10751 Chessboard【数学水题】
  7. Qt入门使用Qt编写程序详细全过程
  8. 数学建模论文题目优选专业题目128个
  9. VB.net Socket Udp收、发数据包示例源码
  10. android webview 清除缓存,Android webView 缓存处理
  11. C#,卡特兰数(Catalan number,明安图数)的算法源代码
  12. 软件测试面试——常见的面试问题总结(大全)
  13. Linux下rsh服务配置
  14. 使用Visual Studio怎样制作登录界面
  15. 影视动画设计有些SCI期刊推荐? - 易智编译EaseEditing
  16. Live800:教育行业新拐点,在线客服系统如何提供价值?
  17. 解读谷歌财报:17亿美元罚款致利润缩减,流量成本激增已迎来下行拐点
  18. 图片转文字软件哪个好用?建议收藏这几款软件
  19. 揭阳学计算机的好学校,揭阳中学排名前十名,2021年揭阳中学排名一览表
  20. 失物招领|基于Web的校园失物招领系统的设计与实现

热门文章

  1. python中的filter函数
  2. autoit选中图标无反应_ps图标教学,使用小技巧。
  3. 如何用python创建文件_终于明了python如何创建文件
  4. fastcopy会损坏硬盘_绚丽多彩 卓有不凡 三星移动固态硬盘T5金属红新品评测
  5. qt 按钮 gradient_少造轮子!推荐一个Qt的Python组件库
  6. 一天学习一点之如何安装nodejs
  7. LeetCode 981.基于时间的键值存储(C++)
  8. Apache JMeter 5.1.1 发布,压力测试工具
  9. IntelliJ IDEA安装lombok
  10. 大数据时代,CRM帮助企业进行升级转型