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

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

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

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

输入格式:

输入的第一行给出正整数 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. python读书笔记-django架站过程总结(from the django book)

    django架站过程总结:1.django-admin startproject store2.store这个project的目录下有:__init__,manage,setting,urls3.se ...

  2. ajax 请求数据的两种方法

    实现ajax 异步访问网络的方法有两个.第一个是原始的方法,第二个是利用jquery包的 原始的方法不用引入jquery包,只需在html中编写script 片段 这里我演示的是一个传递参数查询的例子 ...

  3. 验证组件——FluentValidation

          FluentValidation FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开 ...

  4. Robot Framework 常用关键字使用方法

    1. Select From Listid=sourceConnoracle_source 从下拉框选取值. 2. Select Radio button  name value 选择单选框.也可以点 ...

  5. nyoj 15 括号匹配(二) (经典dp)

    题目链接 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些 ...

  6. 你自认为理解了JavaScript?【转】

    第一题 if (!("a" in window)) { var a = 1; } alert(a); 第二题 var a = 1, b = function a(x) { x &a ...

  7. 如何入门 Python 爬虫?

    作者:谢科   来源:知乎链接:https://www.zhihu.com/question/20899988/answer/24923424 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  8. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  9. Django rest framework 限制访问频率(源码分析)

    基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...

  10. 安全测试===sqlmap(肆)转载

    十八.杂项 1.使用简写 参数:-z 有些参数组合是被经常用到的,如“--batch --random-agent --ignore-proxy --technique=BEU”,这样写一大串很不好看 ...