PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数 N(≤)。随后一行给出 N 个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO。
输入样例 1:
7
8 6 5 7 10 8 11
输出样例 1:
YES
5 7 6 8 11 10 8
输入样例 2:
7
8 10 11 8 6 7 5
输出样例 2:
YES
11 8 10 7 5 6 8
输入样例 3:
7
8 6 8 5 10 9 11
输出样例 3:
NO
因为前面写了二叉树的,所以这道题打算也用那种思路,写是写出来了,但是感觉怪怪的。
我建树是保存的下标编号,因为数可能是一样的,但是下标编号是唯一的。
建完树之后,写了个bfs搜了一下左右节点,发现好像也没毛病,但是自己想的一个样例过不了,肯定是错的代码,应该是后台样例比较水,所以满分水过了。。。

代码写的奇丑无比,但是还是希望有好心人能帮我想想我的代码哪里要改才能改对,过不了的样例:
2
2 1
输出应该为
YES
1 2
我的代码跑不出来。
后面看了一下别人的题解,发现还是别人的思路更简洁好实现一些,学到了,我这个弟弟。
先贴一下我的代码,不要学我的代码,有bug的,找不出来什么问题。。。
代码:
//L2-004 这是二叉搜索树吗?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const int inf=0x3f3f3f3f; int pre[maxn];
int n,flag=; struct node{
int l,r;
}tree[maxn]; int buildmin(int l,int r)
{
if(l>r) return ;
if(r==-) return ;
int rt=pre[l];
int p1=r;
while(pre[p1]>=rt){
if(p1==l) break;
p1--;
}
int minn=inf,pos;
for(int i=p1;i>l;i--){
if(minn>pre[i]){
minn=pre[i];
pos=i;
}
}
for(int i=pos;i>l;i--){
if(pre[i]>=rt){
flag=;break;
}
}
if(flag==){
buildmin(,-);
}
// cout<<pre[p1]<<endl;
else{
if(p1!=l){
tree[l].l=buildmin(l+,p1);
tree[l].r=buildmin(p1+,r);
}
else{
tree[l].r=buildmin(p1+,r);
}
return l;
}
} int buildmax(int l,int r)
{
if(l>r) return ;
if(r==-) return ;
int rt=pre[l];
int p1=r;
while(pre[p1]<rt){
p1--;
}
for(int i=p1;i>l;i--){
if(pre[i]<rt){
flag=;break;
}
}
if(flag==){
buildmax(,-);
}
// cout<<pre[p1]<<endl;
else{
if(p1!=r){
tree[l].l=buildmax(l+,p1);
tree[l].r=buildmax(p1+,r);
}
else{
tree[l].l=buildmax(l+,p1);
}
return l;
}
} void bfs(int x)
{
vector<int> vec;
queue<int> que;
que.push(x);
while(!que.empty()){
int ret=que.front();
que.pop();
if(ret==) break;
vec.push_back(ret);
if(tree[ret].l!=){
que.push(tree[ret].l);
}
if(tree[ret].r!=){
que.push(tree[ret].r);
}
}
int l=vec.size();
for(int i=;i<l;i++)
cout<<pre[vec[i]]<<" ";
cout<<endl;
} vector<int> vec; int behorder(int x)
{
if(tree[x].l==&&tree[x].r==){
if(pre[x]!=)
vec.push_back(pre[x]);
return ;
}
behorder(tree[x].l);
behorder(tree[x].r);
vec.push_back(pre[x]);
} void print()
{
int l=vec.size();
for(int i=;i<l-;i++)
cout<<vec[i]<<" ";
cout<<vec[l-]<<endl;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&pre[i]);
// cout<<"23333333333"<<endl;
if(pre[]<pre[]){
buildmin(,n);
if(flag==) cout<<"NO"<<endl;
else{
// bfs(1);
cout<<"YES"<<endl;
behorder();
print();
}
}
else{
buildmax(,n);
if(flag==) cout<<"NO"<<endl;
else{
// bfs(1);
cout<<"YES"<<endl;
behorder();
print();
}
}
// for(int i=1;i<=n;i++)
// cout<<tree[i].l<<" "<<tree[i].r<<endl;
//
//// else buildmax(1,n);
// behorder(); }
学的别人的思路:
代码:
//L2-004 这是二叉搜索树吗?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const int inf=0x3f3f3f3f; int n;
int isMirror=;
int pre[maxn];
vector<int> vec; int build(int l,int r)
{
if(l>r) return ;
int rt=pre[l];
int p1=l+,p2=r;
if(!isMirror){
while(p1<=r&&rt>pre[p1]) p1++;
while(p2>l&&rt<=pre[p2]) p2--;
}
else{
while(p1<=r&&rt<=pre[p1]) p1++;
while(p2>l&&rt>pre[p2]) p2--;
}
if(p1-p2!=) return ;
build(l+,p2);//按照后序遍历建树
build(p1,r);
vec.push_back(rt);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&pre[i]);
build(,n);
if(vec.size()!=n){
isMirror=;
vec.clear();
build(,n);
}
if(vec.size()==n){
printf("YES\n");
int l=vec.size();
for(int i=;i<l-;i++)
cout<<vec[i]<<" ";
cout<<vec[l-]<<endl;
}
else{
cout<<"NO"<<endl;
}
}
先这样。
PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集的更多相关文章
- 团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- 团体程序设计天梯赛-练习集L1-017. 到底有多二
L1-017. 到底有多二 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个整数“犯二的程度”定义为该数字中包含2的个数与其 ...
- PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...
- PTA L2-002 链表去重 团体程序设计天梯赛-练习集
L2-002 链表去重(25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...
- PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集
L2-023 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集
L2-006 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...
- PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- PTA L1-020 帅到没朋友 团体程序设计天梯赛-练习集
L1-020 帅到没朋友(20 分) 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤),是已 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
随机推荐
- C11简洁之道:tupe元祖
tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair.我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁.直观. ...
- 【hdu5217-括号序列】线段树
题意:给一串括号,有2个操作,1.翻转某个括号.2.查询某段区间内化简后第k个括号是在原序列中的位置.1 ≤ N,Q ≤ 200000. 题解: 可以知道,化简后的序列一定是)))((((这种形式的. ...
- ASP.NET AjaxControlToolkit-Framework4.0 配置实用(简单介绍CalendarExtender日期控件)
1:下载:AjaxControlToolkit Ajax Control Toolkit .NET 4 Ajax Control Toolkit .NET 4.5 Ajax Control Toolk ...
- Python 下调用C动态链接库 -- (转)
在linux开发的动态链接库需要被python调用,首先需要生成.so文件. 生成动态链接库的方法网上有很多,主要就是首先根据源文件编译生成.o,然后链接这些.o文件-shared生成.so.需要注意 ...
- python urllib2练习发送简单post
import urllib2 import urllib url = 'http://localhost/1.php' while True: data = raw_input('(ctrl+c ex ...
- aptitude约等于apt-get的工具
如题,与之不同的是其会将依赖的程序也给删除. https://baike.baidu.com/item/aptitude/6849487?fr=aladdin 以下是一些常用 aptitude命令,仅 ...
- otg device id pin 探討
Platform : Qualcomm MSM8937 PMIC : Qualcomm PMI8940 OTG base on USB2.0,增加 device 可當 host 也可當 periphe ...
- 机器学习开源项目精选TOP30
本文共图文结合,建议阅读5分钟. 本文为大家带来了30个广受好评的机器学习开源项目. 640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1 最近,Mybridge发布了 ...
- python基础===monkeytype可以自动添加注释的模块!
monkeytype 一个可以自动添加注释的模块! 先要下载: pip install monkeytype 以官网的sample code为例 #moudle.py def add(a, b): r ...
- 非 GUI 模式运行 JMeter 压力测试
非 GUI 模式,即命令行模式,运行 JMeter 测试脚本能够大大缩减所需要的系统资源. 使用命令:jmeter -n -t <testplan filename> -l <lis ...