大致题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
   其左子树中所有结点的键值小于该结点的键值;
   其右子树中所有结点的键值大于等于该结点的键值;
   其左右子树都是二叉搜索树。
    所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
 
大致思路:~~以上给出的是二叉搜索树的概念,该树的镜像其实仔细一想无非就是一棵任何节点的右子树严格小于该节点的值,并且相当于建图的时候就是反着反向按照二叉搜索树的结构来存储的。
             于是乎:就按照二叉搜索树的结构建树一次,图上给的正巧就是先序遍历,就先序建图一次!万一是镜像了还要考虑,再按照镜像左右子树正好颠倒的方式来进行二次建图!两次建图后再分别先序遍历——若结果与题目给的一直就符合,后序再次遍历就是结果!若两个都不符合,则输出“NO”!
            最后总结,二叉树搜索树的结构确定了一点,先序遍历的结果一定是唯一的!根据先序遍历的结构构造的二叉树也是唯一的!

——————————————最后自己动手画画,举几个简单的栗子来证明一下自己的猜测,代码里适当地添加了注释了,看不懂了就再点开看看————————————————

AC代码:

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<string>
#include<map>
#define maxn 400000
#define inf 0x3f3f3f3f
using namespace std;
#define N 1008
typedef struct Bitnode{
int data;
struct Bitnode *lchild;
struct Bitnode *rchild;
}Abitnode,*bitree;
int n,n2,n3;
int num[N],num2[N],num3[N];
int n4,ans[N];//存储答案
void insertbitree(bitree *T,int num){
if(*T==NULL){
*T=(bitree)malloc(sizeof(Abitnode));
(*T)->data=num;
(*T)->lchild=NULL;
(*T)->rchild=NULL;
return ;
}
if((*T)->data > num){
insertbitree(&(*T)->lchild,num);//左子树严格小于根节点的值
}else{
insertbitree(&(*T)->rchild,num);
}
}
void fact2(bitree *T){//按照先序遍历,二叉搜索树:左子树严格小
if((*T)!=NULL){
num2[++n2]=(*T)->data;
fact2(&(*T)->lchild);
fact2(&(*T)->rchild);
}
return ;
}
void fact3(bitree *T){//按照先序遍历,二叉搜索树的镜像:右子树严格小
if((*T)!=NULL){
num3[++n3]=(*T)->data;
fact3(&(*T)->rchild);
fact3(&(*T)->lchild);
}
return ;
}
bool judge(int a[],int b[]){
for(int i=;i<=n;i++)
if(a[i]!=b[i])
return false;
return true;
}
void post_print2(bitree *T){//后续遍历输出二叉搜索树,存到ans中
if(*T!=NULL){
post_print2(&(*T)->lchild);
post_print2(&(*T)->rchild);
ans[++n4]=((*T)->data);
}
}
void post_print3(bitree *T){//后续遍历输出镜像,存到ans中
if(*T!=NULL){
post_print3(&(*T)->rchild);
post_print3(&(*T)->lchild);
ans[++n4]=((*T)->data);
}
}
void print_ans(){
printf("YES\n");
for(int i=;i<=n;i++){
if(i==n)
printf("%d\n",ans[i]);
else
printf("%d ",ans[i]);
}
return ;
}
int main(){
bitree T;
while(scanf("%d",&n)!=EOF){//既然是前序遍历,第一个点铁定是根节点
T=NULL;
for(int i=;i<=n;i++){//按照前序遍历的顺序
scanf("%d",&num[i]);
insertbitree(&T,num[i]);
}
n2=;
fact2(&T);
n3=;
fact3(&T);
n4=;
if(judge(num,num2)){//如果是二叉搜索树
post_print2(&T);
print_ans();
}
else if(judge(num,num3)){//如果是二叉搜索树的镜像
post_print3(&T);
print_ans();
}
else{
printf("NO\n");
}
}
return ;
}
/*
题目思路:1、正常按二叉树进行建立,然后按照规则进行搜索——OK!;
2、404!
*/

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

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

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

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

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

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

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

  4. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  5. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  6. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  7. PAT 天梯赛 L2-004 这是二叉搜索树吗?

    递归判断+建树 题目链接:https://www.patest.cn/contests/gplt/L2-004 题解 二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小 ...

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

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

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

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

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

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

随机推荐

  1. python:动态参数*args

    动态参数 顾名思义,动态参数就是传入的参数的个数是动态的,可以是1个.2个到任意个,还可以是0个.在不需要的时候,你完全可以忽略动态函数,不用给它传递任何值. Python的动态参数有两种,分别是*a ...

  2. 简简单单储存过程——循环一个select结果集

    原文地址:https://shitou521.iteye.com/blog/1069027 摘要:本文主要讲解了存储过程的创建.调用.以及游标的使用 ,相信掌握了游标      会对你有不错的帮助,有 ...

  3. 12、OpenCV实现图像的直方图处理

    1.直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度 ...

  4. 使用 LVS 实现负载均衡原理及安装配置详解(课堂随笔)

    一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...

  5. Intellij热部署插件JRebel的详细配置及图解

    参考博客地址:https://blog.csdn.net/nyotengu/article/details/80629631 参考博客地址:https://blog.csdn.net/weixin_4 ...

  6. jpa简单demo调试druid

    Druid连接池配置见https://www.cnblogs.com/blindjava/p/11504524.html pom <dependency> <groupId>m ...

  7. 【SCALA】3、模拟电路

    Simulation package demo17 abstract class Simulation { type Action = () => Unit case class WorkIte ...

  8. JQuery EasyUI框架

    1. JQuery EasyUI框架概述 1.1. JQuery EasyUI是什么东西 答:JQuery  EasyUI就是一套基础JQuery的富客户端的UI框架.像这些将常用的控件封装成一个UI ...

  9. 模板模式(Template Pattern)

    模板模式(Template Pattern) -- 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. ...

  10. Broom |tidy up a bit,模型,检验结果一键输出!

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/TqFk66F2gUu_k8WEjKbLtA 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...