博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789220.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~

题意:给出一个序列,问你是否是一棵二叉搜索树或者是其镜像的前序遍历。
并且输出其后序遍历。

一开始没考虑到只有一个子树...比如
BST
7
8 11 9 8 10 13 12
MIRROR
7
8 11 13 12 9 10 8
所以要先判断是否为BST,不是的话再判断是否为mirror BST
都不是输出NO

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#define LEFT 1
#define RIGHT 2 using namespace std;
const int maxn=;
int n;
int seq[maxn];
int cnt=;
struct Node{
int left=-;
int right=-;
int val;
}node[maxn];
/**
判断对应区间[l,r]是否为二叉搜索树
fa为其父亲节点
leftOrRight表示该子树为父亲节点的左孩子还是右孩子
*/
bool solveBST(int l,int r,int fa,int leftOrRight){
//printf("l:%d r:%d fa:%d leftorRight:%d\n",l,r,fa,leftOrRight);
if(l>r)
return true;
if(l==r){
node[cnt].val=seq[l];
if(leftOrRight==LEFT){
node[fa].left=cnt;
}
else{
node[fa].right=cnt;
}
cnt++;
return true;
}
node[cnt].val=seq[l];
int val=seq[l];
int id=cnt; if(fa!=-){
if(leftOrRight==LEFT){
node[fa].left=cnt;
}
else{
node[fa].right=cnt;
}
}
cnt++;
int i;
for(i=l+;i<=r;i++){
if(seq[i]>=val){
break;
}
}
for(int j=i+;j<=r;j++){
//如果右子树应该都>=val,如果有小于的,那么就不是BST
//printf("seq[j]:%d val:%d\n",seq[j],val);
if(seq[j]<val){
return false;
}
}
if(!solveBST(l+,i-,id,LEFT))
return false;
if(!solveBST(i,r,id,RIGHT))
return false;
return true;
}
/**
判断对应区间[l,r]是否为二叉搜索树的镜像
fa为其父亲节点
leftOrRight表示该子树为父亲节点的左孩子还是右孩子
*/
bool solveMirrorBST(int l,int r,int fa,int leftOrRight){
//printf("l:%d r:%d fa:%d leftorRight:%d\n",l,r,fa,leftOrRight);
if(l>r)
return true;
if(l==r){
node[cnt].val=seq[l];
if(leftOrRight==LEFT){
node[fa].left=cnt;
}
else{
node[fa].right=cnt;
}
cnt++;
return true;
}
node[cnt].val=seq[l];
int val=seq[l];
int id=cnt; if(fa!=-){
if(leftOrRight==LEFT){
node[fa].left=cnt;
}
else{
node[fa].right=cnt;
}
}
cnt++;
int i;
for(i=l+;i<=r;i++){
if(seq[i]<val){
break;
}
}
for(int j=i+;j<=r;j++){
//mirror的右子树应该都是<val,如果不是,则不是mirror BST
if(seq[j]>=val){
return false;
}
}
if(!solveMirrorBST(l+,i-,id,LEFT))
return false;
if(!solveMirrorBST(i,r,id,RIGHT))
return false;
return true;
}
bool first=true;
void postOrder(int u){
if(u==-)
return;
postOrder(node[u].left);
postOrder(node[u].right);
if(first){
printf("%d",node[u].val);
first=false;
}
else
printf(" %d",node[u].val);
}
void init(){
cnt=;
for(int i=;i<maxn;i++){
node[i].left=node[i].right=-;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&seq[i]);
}
if(solveBST(,n-,-,-)){
printf("YES\n");
postOrder();
}
else{
init();
if(solveMirrorBST(,n-,-,-)){
printf("YES\n");
postOrder();
}
else{
printf("NO\n");
} }
return ;
}

PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树的更多相关文章

  1. PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题

    1043 Is It a Binary Search Tree (25 分)   A Binary Search Tree (BST) is recursively defined as a bina ...

  2. PAT (Advanced Level) 1043. Is It a Binary Search Tree (25)

    简单题.构造出二叉搜索树,然后check一下. #include<stdio.h> #include<algorithm> using namespace std; +; st ...

  3. PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟

    模拟先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站0 1 2 3 4 5 6 7 87.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 00 150 200 300 4 ...

  4. PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)

    题意:给出一个序列,构建二叉搜索树(BST),输出二叉搜索树最后两层的节点个数n1和n2,以及他们的和sum: n1 + n2 = sum 递归建树,然后再dfs求出最大层数,接着再dfs计算出最后两 ...

  5. 【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)

    题意: 输入一个正整数N(<=1000),接下来输入N个点的序号.如果刚才输入的序列是一颗二叉搜索树或它的镜像(中心翻转180°)的先序遍历,那么输出YES并输出它的后序遍历,否则输出NO. t ...

  6. PAT Advanced 1043 Is It a Binary Search Tree (25) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  7. PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  8. 1043. Is It a Binary Search Tree (25)

    the problem is from pat,which website is http://pat.zju.edu.cn/contests/pat-a-practise/1043 and the ...

  9. [LC] 700题 Search in a Binary Search Tree (二叉搜索树中的搜索) (二叉搜索树)

    ①中文题目 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 在上述示例 ...

随机推荐

  1. django复习-1-环境搭建和创建项目

    一.虚拟环境搭建 1. 创建虚拟环境,需要联网 mkvirtualenv django_py3_1.11 -p python3 2. 安装Django 使用django 1.11.11版本,注意需要联 ...

  2. 【Ansible 文档】【译文】Windows 支持

    see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...

  3. saltstack二次开发(一)

    Saltstack简介 Salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行),一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则 ...

  4. Java 回调函数例子

    首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用. public class Caller { private MyCallInterface callIn ...

  5. 服务发现系统etcd之安装和使用

    一.概述 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致 ...

  6. OpenCV——直方图均衡化(用于图像增强)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  7. OO课程学期末总结

    OO课程学期末总结 测试VS正确性论证 OCL vs JSF 对象约束语言(Object Constraint Language), 简称OCL, 是一种指示用户建模系统中的限制方式. 他是UML可选 ...

  8. 注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机

    注冊成为Windows Phone开发人员而且解锁Windows Phone 8.1手机 上篇文章介绍了怎样使用Qt Creator和Visual Studio构建Windows Phone 8.1应 ...

  9. Ubuntu系统上双节点部署OpenStack

    安装和部署双节点OpenStack 介绍: 1.宿主机:Win10操作系统 2.在VMware下创建两台虚拟机: devstack-controller:控制节点 + 网络节点 + 块存储节点 + 计 ...

  10. Docker学习笔记 — 开启Docker远程访问

    默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker ...