一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 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 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集的更多相关文章

  1. 团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗

    L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...

  2. 团体程序设计天梯赛-练习集L1-017. 到底有多二

    L1-017. 到底有多二 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个整数“犯二的程度”定义为该数字中包含2的个数与其 ...

  3. PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二

    一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...

  4. PTA L2-002 链表去重 团体程序设计天梯赛-练习集

    L2-002 链表去重(25 分)   给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...

  5. PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

    L2-023 图着色问题 (25 分)   图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...

  6. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  7. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  8. PTA L1-020 帅到没朋友 团体程序设计天梯赛-练习集

    L1-020 帅到没朋友(20 分)   当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤),是已 ...

  9. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

随机推荐

  1. linux查找进程id端口占用和杀死进程

    linux 查找进程id端口占用和杀死进程 ps 命令用于查看当前正在运行的进程 辅助上grep 用于搜索匹配ps -ef | grep java ps ax : 显示当前系统进程的列表 ps aux ...

  2. HDU 5961 传递 BFS

    题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...

  3. .net core 安装Swagger

    Install-Package Swashbuckle -Pre 1.Startup // This method gets called by the runtime. Use this metho ...

  4. 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树

    题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...

  5. 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]

    新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...

  6. 【51NOD-0】1019 逆序数

    [算法]离散化+树状数组(求逆序对) [题解]经典,原理是统计在i之前插入的且值≤i的个数,然后答案就是i-getsum(i) #include<cstdio> #include<a ...

  7. 基本控件文档-UILabel属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址   //转载请注明出处--本文永久链接:http://www.cnblogs.com/ ...

  8. Go从入门到精通(持续更新)

    1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...

  9. bzoj 1503 平衡树

    我们可以用一颗平衡树维护每个人的工资,因为工资的变化会影响到后面所有的人,所以我们打一个标签,向平衡树里插入的时候减去这个标签的值,这样代表改变了之后的零点,,这样维护这个标签就好了,输出的时候要加上 ...

  10. arch中yaourt的安装和使用

    yaourt-Yet AnOther User Repository Tool Yaourt是archlinux方便使用的关键部件之一,但没有被整合到系统安装中的工具.建议在装完系统重启之后,更新完p ...