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/ ...
随机推荐
- echarts.js中的图表大小自适应
echarts的图表,如果父级容器的height/width属性设置为百分比的形式,那么echarts就会warning,且不能正常的生成图表.所以div容器的高度宽度必须指定为px,这设计不知道是为 ...
- Debug模式下加载文件,运行程序异常的慢
今天在进行单元测试的时候,debug模式下加载速度很慢,但是run模式下速度很快. 原因:在debug模式下,断点位置不当,解决办法 移除编译器中的所有断点.
- 10.nginx+ffmpeg上搭建HLS切片
1.首先介绍一下HLS协议: (1)简介 这个协议是由苹果公司提出并推广使用的,维基百科介绍如下: HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络 ...
- HDU 5533Dancing Stars on Me 基础几何
Problem Description The sky was brushed clean by the wind and the stars were cold in a black sky. Wh ...
- idea 导入 java json 包
1.java 项目导包 找到 External Libraries 下面的java版本包,在点击鼠标右键.直接找到jar路径全部选中导入即可.
- Windows平台下搭建Git服务器的图文教程
Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...
- 仿照linux dpm机制,实现自己的dpm【转】
转自:http://blog.csdn.net/lixiaojie1012/article/details/23788713 前边我们讨论分析了linux 内核的dpm实现,分析的目的在于学以致用:在 ...
- Android IPC
1. 什么是Android IPC IPC:inter-process Commnication跨进程的通信,多进程之间的通信,不同的操作系统有不同的通信方式,Android继承自Linux,但其IP ...
- 初学者学习Javascript很吃力怎么办?到底该如何学习Js?
Js给初学者的印象总是那么的“杂而乱”,相信很多初学者都在找轻松学习Js的途径.在这里给大家总结一些学习Js的经验,希望能给后来的学习者探索出一条“轻松学习Js之路”. Js给人那种感觉的原因多半 ...
- 根据节点解析xml
config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...