递归判断+建树

题目链接:https://www.patest.cn/contests/gplt/L2-004

题解

二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小于等于右子树的所有值。而先序遍历的序列,第一个值就是其根的值,我们可以利用这些性质来递归判断一棵树是否为二叉搜索树。

首先,遍历这个序列,找到第一个大于等于根节点值的节点,如果从这个节点开始之后的所有节点的值都是大于等于根节点的,那么这棵树就是二叉搜索树。而二叉搜索树的“镜像”也可以利用这种思想进行判断。

如果是一棵二叉搜索树或者是其镜像,我们就可以开始建树,建树之后可以递归的输出其后序遍历序列。

代码如下:

#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 1000+10; struct Node {
int value;
Node *lson, *rson;
Node():lson(NULL),rson(NULL){}
}*root; int n;
int s[maxn];
vector<int> ans; //当kind为true,代表进行二叉搜索树的判断,当kind为false,代表进行二叉搜索树镜像判断
bool _test(bool kind, int L, int R) {
if(L >= R)return true;
int i;
for(i = L+1; i <= R; i++) {
if(kind) {
if(s[L] <= s[i]) {
break;
}
}else {
if(s[L] > s[i]) {
break;
}
}
}
bool flag = true;
for(int j = i; j <= R; j++) {
if(kind) {
if(s[j] < s[L]){
flag = false;
}
}else {
if(s[j] >= s[L]) {
flag = false;
}
}
}
if(flag) {
return _test(kind, L+1, i-1) && _test(kind, i, R);
}else {
return false;
}
} Node* _build(bool kind, int L, int R) {
if(L > R) return NULL;
int i;
for(i = L+1; i <= R; i++) {
if(kind) {
if(s[L] <= s[i]) {
break;
}
}else {
if(s[L] > s[i]) {
break;
}
}
}
Node *p = new Node();
p->value = s[L];
p->lson = _build(kind, L+1, i-1);
p->rson = _build(kind, i, R);
return p;
} void post_order(Node *p) {
if(p != NULL) {
post_order(p->lson);
post_order(p->rson);
ans.push_back(p->value);
}
} void out_put() {
post_order(root);
int len = ans.size();
for(int i = 0; i < len; i++) {
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &s[i]);
}
int flag = 0;
if(_test(true, 0, n-1)) {
flag = 1;
root = _build(true, 0, n-1);
}else if(_test(false, 0, n-1)) {
flag = 2;
root = _build(false, 0, n-1);
}
if(flag != 0) {
puts("YES");
out_put();
}else {
puts("NO");
}
return 0;
}

PAT 天梯赛 L2-004 这是二叉搜索树吗?的更多相关文章

  1. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  2. 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

    题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...

  3. PAT 天梯赛 L1-017. 到底有多二 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-017 AC代码 #include <iostream> #include <cstdio&g ...

  4. PAT天梯赛L2-004 这是二叉搜索树吗【递归】

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

  5. PAT 天梯赛 是否完全二叉搜索树   (30分)(二叉搜索树 数组)

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...

  6. PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树 指针)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  7. pat 团体天梯赛 L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  8. pat 团体天梯赛 L2-004. 这是二叉搜索树吗?

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

  9. PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】

    题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...

随机推荐

  1. 两层嵌套的JSON包的解法

    由于后台的变态,有时候会出现两层甚至多层嵌套的JSON包. 一层的很好解,而且我看过一些比较大的网站新闻接口返回的JSON包也仅仅是一层的. 比如下图所示一层的包 代码也很简单直观 dict = [d ...

  2. Linux教程之配置权限受限制的SFTP

    SFTP 在Linux下是一个很方便很安全的文件传输工具,我常常用它在Linux服务器上替代传统的ftp来传输文件.众所周知SFTP账号是基于SSH账号的,默认情况下访问服务器的权限很大,下面的教程就 ...

  3. Entity Framework 学习中级篇3—存储过程(中)

    目前,EF对存储过程的支持并不完善.存在以下问题: l         EF不支持存储过程返回多表联合查询的结果集. l         EF仅支持返回返回某个表的全部字段,以便转换成对应的实体.无法 ...

  4. 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E

    http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...

  5. IOS抓包工具paros的使用

    一,环境安装,软件安装 1.下载安装java JDK for Mac,可以从Oracle官网下载(但是一般Oracle的都是最新的版本的),或者从苹果的开发者网站下载,我是从苹果官网下载的javafo ...

  6. idea编译器中maven项目获取路径的方法

    资源文件放在哪里? 上 图中的 resources 目录叫资源目录 (main下,与java如果没有请自行创建), 在项目编译后文件会被放到红色的 classes 目录下, 注意如果你的 resour ...

  7. Openlayers 3 热力图

    <body> <div id="map"></div> <script> var map = new ol.Map({ //初始化m ...

  8. Openlayers 3 图层探查功能

    <body> <div id="map"></div> <script> var map=new ol.Map({ target:& ...

  9. 转:Jmeter 用户思考时间(User think time),定时器,和代理服务器(proxy server)

    在负载测试中需要考虑的的一个重要要素是思考时间(think time), 也就是在两次成功的访问请求之间的暂停时间. 有多种情形挥发导致延迟的发生: 用户需要时间阅读文字内容,或者填表,或者查找正确的 ...

  10. HDU 3552 I can do it!

    脑洞题.http://blog.csdn.net/dgq8211/article/details/7748078 #include<cstdio> #include<cstring& ...