PAT 天梯赛 L2-004 这是二叉搜索树吗?
递归判断+建树
题目链接: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 这是二叉搜索树吗?的更多相关文章
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
- PAT 天梯赛 L1-017. 到底有多二 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-017 AC代码 #include <iostream> #include <cstdio&g ...
- PAT天梯赛L2-004 这是二叉搜索树吗【递归】
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- PAT 天梯赛 是否完全二叉搜索树 (30分)(二叉搜索树 数组)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- pat 团体天梯赛 L3-010. 是否完全二叉搜索树
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- pat 团体天梯赛 L2-004. 这是二叉搜索树吗?
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】
题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...
随机推荐
- MinGW 运行C++程序的方法
1:安装好 MinGW 及 GCC 编译器后 , 当然 MinGW 全安装最保险了,不会太费劲 2:配置环境变量(注:可能需要重启后生效) 计算机 --> 属性 --> 高级系统设置 -- ...
- cdn是什么
CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构, 将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近 ...
- php 获取地址栏参数
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现: //获取域名或主机地址 echo $_SERVER[' ...
- caffe卷积输入通道如何到输出通道
今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...
- Linux入门学习教程:虚拟机体验之KVM篇
本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2. dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...
- spring securiy使用总结
我们常见的几个功能: 注册后直接登录,并且remember-me这种在网上找到很多注册后登录的,但是remember-me没有.其实解决方案还是看源码比较方便.a. 装载authenticationM ...
- reactor与proactor模式
在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步. 同步和异步是针对应用程序和内核的交互而言的. 同步是指用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 ...
- FreeRTOS中断优先级配置(重要)
FreeRTOS中断优先级配置(重要) 本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊.对于初学者来说,本章节务必要整明白.12.1 NVIC基础知识12.2 ...
- git repository 的使用
1. You should only be pushing to a bare repository. A bare repository is a repository that has no ch ...
- ant android打包--学习第一弹
1. 准备工作 用eclipse创建一个android项目 安装ant和SDK,并且添加到系统环境变量 2.ant 使用 2.1 ant简单的帮助命令 ant -p 2.2 创建ant配置文件%AND ...