2022天梯赛热身赛 浪漫侧影(什么原题)
题意: 给定一棵二叉树的中序和后序遍历,求左视图和右视图。意思是求每一层的第一个节点和最后一个节点,层次遍历就行了。套皮题。
思路:
1.我的笨法,由于每个数的值不一样,直接建的树,之后bfs即可,写的有点麻烦了,应该用深度的,写成2^i对应位置了,因为n才20.
2.大佬的妙法,直接根据中序和后序跑前序。因为根左右不就是层次遍历嘛,连树都不用建。
时间复杂度: O(能过)
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 1e6+10;
int n,m,k,T;
int a[N];
int va[N]; //中序
int vb[N]; //后序
map<int,int> l,r;
int get(int l1,int r1,int l2,int r2)
{if(l1 > r1) return -1;if(l1 == r1) {return va[l1];}int root = vb[r2];int idx;for(int i=l1;i<=r1;++i){if(va[i] == root){idx = i;break;}}int len = idx-1-l1+1;l[root] = get(l1,idx-1,l2,l2+len-1);r[root] = get(idx+1,r1,l2+len,r2-1);return root;
}
void bfs()
{queue<PII> q;q.push({1,vb[n]});while(q.size()){PII tmp = q.front(); q.pop();int u = tmp.second;int wh = tmp.first;a[wh] = u;if(l[u]>0){q.push({wh*2,l[u]});}if(r[u]>0){q.push({wh*2+1,r[u]});}}
}
void solve()
{cin>>n;for(int i=1;i<=n;++i) cin>>va[i];for(int i=1;i<=n;++i) cin>>vb[i];get(1,n,1,n);// for(int i=1;i<=n;++i)// {// cout<<i<<":"<<l[i]<<" "<<r[i]<<endl;// }bfs();vector<int> ans,res;for(int i=0;i<n;++i){for(int j=(1<<i);j<=(1<<(i+1))-1;++j){if(a[j]){ans.push_back(a[j]);break;}}for(int j=(1<<(i+1))-1;j>=(1<<i);--j){if(a[j]){res.push_back(a[j]);break;}}}printf("R: "); for(int i=0;i<res.size();++i) {if(i) cout<<' '; cout<<res[i];}printf("\n");printf("L: "); for(int i=0;i<ans.size();++i) {if(i) cout<<' '; cout<<ans[i];}
}
signed main(void)
{solve();return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 202;
int in[N];
int post[N];
vector<int> va[N]; //深度为i的点
int n,m,k,T;
void pre(int root,int l,int r,int dep)
{// if(l == 0) return;if(l > r) return ;int idx;for(int i=l;i<=r;++i) if(in[i] == post[root]) idx = i;va[dep].push_back(in[idx]);//不能用idx-1,如果相等也是巧合,那个不是真正的左子树树根位置pre(root-1-(r-idx),l,idx-1,dep+1); //这里要用中序求右子树长度推后序中左子树树根的位置,否则会错.pre(root-1,idx+1,r,dep+1);
}
void solve()
{cin>>n;for(int i=1;i<=n;++i) cin>>in[i];for(int i=1;i<=n;++i) cin>>post[i];pre(n,1,n,1);printf("R:");for(int i=1;;++i){if(va[i].size()){cout<<" "<<va[i].back();}else break;}puts("");printf("L:");for(int i=1;;++i){if(va[i].size()){cout<<" "<<va[i][0];}else break;}
}
signed main(void)
{solve();return 0;
}
2022天梯赛热身赛 浪漫侧影(什么原题)相关推荐
- 2022/4/18 天梯赛刷题记录2022天梯赛热身赛
L1 1~8 语法到模拟 L2-1 栈.map L2-2 set.排序 L2-4 模拟 L3-2 背包 L2-3 写不出来,二叉树这方面是真的薄弱 周日热身赛的时候因为一直内部错误直接润了,今天重新做 ...
- 2022天梯赛 L1-086 斯德哥尔摩火车上的题
上图是新浪微博上的一则趣闻,是瑞典斯德哥尔摩火车上的一道题,看上去是段伪代码: s = '' a = '1112031584' for (i = 1; i < length(a); i++) { ...
- 【GPLT】【2022天梯赛真题题解】
L1-1 今天我要赢(5分) 题目描述 2018 年我们曾经出过一题,是输出"2018 我们要赢".今年是 2022 年,你要输出的句子变成了"我要赢!就在今天!&quo ...
- 记2022天梯赛正式赛
补题链接:PTA | 程序设计类实验辅助教学平台 目录 L1-1 今天我要赢 (5 分) L1-2 种钻石 (5 分) L1-3 谁能进图书馆 (10 分) L1-4 拯救外星人 (10 分) L1- ...
- 2022天梯赛个人代码留存
L1-1 今天我要赢 (5 分) 2018 年我们曾经出过一题,是输出"2018 我们要赢".今年是 2022 年,你要输出的句子变成了"我要赢!就在今天!"然 ...
- 2022天梯赛正式赛(附天梯赛题目链接)
文章目录 L1-1 今天我要赢 (5 分) L1-2 种钻石 (5 分) L1-3 谁能进图书馆 (10 分) L1-4 拯救外星人 (10 分) L1-5 试试手气 (15 分) L1-6 斯德哥尔 ...
- 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
本篇文章对第十四届蓝桥杯第三期模拟赛所有的题目进行了详细解析.如果大家还想刷题的话,我给大家整理出了第十二届的省赛真题:第十二届省赛C/C++ B组真题.推荐大家可以去做一下. 文章目录 一.填空题 ...
- 计算机天梯赛pat练习集L1-(31~88题)
文章目录: 31.到底是不是太胖了 32.Left-pad 33.出生年 34.点赞 35.情人节 36.A乘以B 37.A除以B 38.新世界 39.古风排版 40.最佳情侣身高差 41.寻找250 ...
- 2022国赛高教杯数学建模A题B题(预测)
2022国赛高教杯A题: 如何正确看待外企商品 随着经济和科技的发展,科技与生活融为一体,越来越多的智能科技化商品涌现在国内市场,有些商品例如手机已经成为当代人出门必用的付款.出行证明的媒介, ...
最新文章
- 什么是SOLID原则(第3部分)
- 机器学习的5个常见痛点及解决方法
- 解决ssh7.4升级8.5后环境变量失效和无法登录问题
- Zookeeper的概述
- Android安全笔记-Service基本概念
- 新入职了一个卷王 , 天天加班12点!张口闭口就手写spring , 太让人崩溃了......
- SQL Server 全文索引创建
- ES6精解:箭头函数
- 马化腾怒怼张一鸣;中兴产品下架;微信整改小程序 | CSDN 极客头条
- 图像处理系统概述(白皮书)
- Atom: 几个常用的快捷键,恢复主菜单
- 容器技术Docker K8s 46 Serverless Kubernetes(ASK)详解-场景应用
- 百度文库源码php,仿百度文库或豆丁网在线浏览doc.pdf.xls.txt源码
- 川农计算机应用基础考试文档,中学生计算机基础考试题库
- UML核心元素--参与者
- 全面的在线教育直播平台是怎样的呢?
- python: 集合操作符和关系符号
- win10怎么取消小箭头_已取消到该网页的导航,小编教你网页提示已取消到该网页的导航怎么办...
- 小米10青春版刷鸿蒙,功能齐全也不行!小米10青春版现已跌至新低价,高刷已成趋势?...
- BAT在互联网医疗的产业布局分析