PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
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)-二叉搜索树的更多相关文章
- 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 ...
- PAT (Advanced Level) 1043. Is It a Binary Search Tree (25)
简单题.构造出二叉搜索树,然后check一下. #include<stdio.h> #include<algorithm> using namespace std; +; st ...
- 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 ...
- PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)
题意:给出一个序列,构建二叉搜索树(BST),输出二叉搜索树最后两层的节点个数n1和n2,以及他们的和sum: n1 + n2 = sum 递归建树,然后再dfs求出最大层数,接着再dfs计算出最后两 ...
- 【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)
题意: 输入一个正整数N(<=1000),接下来输入N个点的序号.如果刚才输入的序列是一颗二叉搜索树或它的镜像(中心翻转180°)的先序遍历,那么输出YES并输出它的后序遍历,否则输出NO. t ...
- 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 ...
- 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 ...
- 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 ...
- [LC] 700题 Search in a Binary Search Tree (二叉搜索树中的搜索) (二叉搜索树)
①中文题目 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 在上述示例 ...
随机推荐
- 1.3Windows控制台的简单操作:
目录: 1.控制台的打开 2.盘符的跳转 3.跳转到某个文件夹 4.展示文件 5.清屏 6.历史记录 7.拖动添加路径 8.自动补齐 9.正常退出 1.打开控制台:系统图标键 + R,输入cmd,按回 ...
- FastDFS_v5.05+nginx+cache集群安装配置手册
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.FastDFS简单介绍 FastDFS是由淘宝的余庆先生所开发,是一个轻量级.高性能的开源分布式文件系统, ...
- CHECKEDLISTBOX用法总结
C# CHECKEDLISTBOX用法总结 一般认为:foreach (object obj in checkedListBox1.SelectedItems)即可遍历选中的值. 其实这里遍历的只 ...
- 拯救U盘之——轻松修复U盘“无法访问”的故障
在使用U盘或者移动硬盘的过程中,大家是否和我一样,有个不好的操作习惯,明知不好但是在每次使用时都很少记得“安全删除硬件”,随手一把走人.终于出问题了,那天给mm复制完资料,拔了再插到自己的电脑上,打开 ...
- 7、JVM--虚拟机类加载机制
7.1.概述 再类文件结构中 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用. 而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机后会发生什么变化? ...
- CentOS7.5搭建Flask环境python3.6+mysql+redis+virtualenv
wget安装环境装备 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncur ...
- bip39
BIP: 39 (助记词) Layer: Applications Title: Mnemonic code for generating deterministic keys Author: Mar ...
- svn 更新提交文件冲突
文件冲突定义:svn up更新服务器文档到本地的时候发现本地的文件有所改动,和svn服务器不同步 服务器会报冲突,让你觉得已谁的为准,根据实际情况我们需要选择是以服务器还是以本地代码为准 报错: Co ...
- JS实现网页换肤功能效果
网页换肤的基本原理 使用 JS 切换对应的 CSS 样式表.例如hao123首页的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过 ...
- Android调用系统的发邮件功能
package com.example.myapi.email; import java.util.ArrayList; import java.util.List; import android.c ...