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/ ...
随机推荐
- git fatal: 拒绝合并无关的历史的错误解决
本地初始化的项目 与 github 版本不一致, 导致无法提交 $ git pull origin master 来自 https://github.com/itaken/python-login-d ...
- CSS知识之 background-size 用法详细介绍
background-size是CSS3新增的比较实用的属性,使用它可以随心所欲地控制背景图的显示大小,而在css2中背景图的大小是不可控制的. 基本语法: 用于设置背景图片的大小,有2个可选值,第1 ...
- Hadoop 介绍
1.Hadoop简介 Hadoop[hædu:p]实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低 ...
- HDU1164
//HDU 1164 //输入一个数(1<x<=65535) 转化为素数的乘积() #include "iostream" #include "cstdio& ...
- [洛谷P3338] [ZJOI2014]力
洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...
- python实现堆栈、队列
一.利用python列表实现堆栈和队列 堆栈: 堆栈是一个后进先出的数据结构,其工作方式就像生活中常见到的直梯,先进去的人肯定是最后出. 我们可以设置一个类,用列表来存放栈中的元素的信息,利用列表的a ...
- unity ugui缩放+移动
本文仅仅记录自己在工作中踩到的ugui的坑.并讲述如何填的坑. 干货罗列在前,不愿意看的,拿东西走人,自己研究: RectTransform m_Rect m_Rect.localPosition m ...
- 【NOIP】2016 换教室
[算法]期望DP+floyd [题解]用floyd预处理最短距离. 注意重边与自环——图论双毒!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! QAQ 然后搞清楚方案和概率的问 ...
- embed标签 阻止点击事件 让父元素处理点击事件
由于规定页面显示的PDF文件要有固定大小,使得页面风格统一 最开始发现了CSS样式pointer-events 写出如下代码,在360急速浏览器急速模式中访问可在点击PDF控件时可跳转页面 <a ...
- feign hystrix 线程池伸缩控制
当前使用的版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...