一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO

输入样例 1:

7
8 6 5 7 10 8 11

输出样例 1:

YES
5 7 6 8 11 10 8

输入样例 2:

7
8 10 11 8 6 7 5

输出样例 2:

YES
11 8 10 7 5 6 8

输入样例 3:

7
8 6 8 5 10 9 11

输出样例 3:

NO

思路:

拿到这个题,想到的就是用数据结构学的二叉搜索树,去建树,前序遍历,然后比对,在反转,前序遍历,再比对,比对成功就后序遍历输出,不成功就输出NO。写的比较繁琐,比较菜,希望各位巨巨指正orz

AC代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<map>
#define INF 0x3f3f3f3f
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define fori(x) for(int i=0;i<x;i++)
#define forj(x) for(int j=0;j<x;j++)
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(y))
#define sca(x) scanf("%d", &x)
#define scas(x) scanf("%s",x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define pri(x) printf("%d\n",x)
#define pri2(x,y) printf("%d %d\n",x,y)
#define pris(x) printf("%s\n",x)
#define prl(x) printf("%lld\n",x)
//#include <bits/stdc++.h>typedef long long ll;
const int maxn=1e6+7;
const int mod=1e9+7;
const double eps=1e-8;using namespace std;int a[maxn];
int pre1[maxn];
int pre2[maxn];
int post1[maxn];
int post2[maxn];
typedef struct BiTree
{int data;BiTree *left,*right;
}tree;
tree* creatbtree(int a[],int n)
{tree *p,*pa,*c,*root;//创建根节点root=(tree*)malloc(sizeof(tree));root->data=a[0];root->left=root->right=NULL;for(int i=1;i<n;i++){p=(tree*)malloc(sizeof(tree));p->data=a[i];p->left=p->right=NULL;c=root;while(c){pa=c;if(c->data>p->data)c=c->left;elsec=c->right;}if(pa->data>p->data)pa->left=p;elsepa->right=p;}return root;
}
void swaptree(tree *&T)
{if(T == NULL)return;else{swaptree(T->left);swaptree(T->right);tree *temp;temp = T->left;T->left = T->right;T->right = temp;}
}
int pos;
void PreOrderTraverse(tree *T,int a[])
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。有改动// 操作结果:先序递归遍历T,对每个结点访问一次if(T){a[pos++] = T->data;//printf("%d ",T->data);PreOrderTraverse(T->left,a);PreOrderTraverse(T->right,a);}
}
void PostOrderTraverse(tree *T,int a[])
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数// 操作结果:后序递归遍历T,对每个结点访问一次if(T){PostOrderTraverse(T->left,a);PostOrderTraverse(T->right,a);a[pos++] = T->data;}
}
int main()
{string temp;int n;sca(n);rep(i,0,n){sca(a[i]);}tree *root;root = creatbtree(a,n);pos = 0;PreOrderTraverse(root, pre1);int flag1 = 1, flag2 = 1;rep(i,0,n){if(pre1[i] == a[i])continue;else{flag1 = 0;break;}}if(flag1){printf("YES\n");pos = 0;PostOrderTraverse(root, post1);rep(i,0,n){printf("%d%c",post1[i],i==n-1?'\n':' ');}flag2 = 0;}if(flag2){swaptree(root);pos = 0;PreOrderTraverse(root, pre2);rep(i,0,n){if(pre2[i] == a[i])continue;else{flag2 = 0;break;}}}if(flag2){printf("YES\n");pos = 0;PostOrderTraverse(root, post2);rep(i,0,n){printf("%d%c",post2[i],i==n-1?'\n':' ');}}if(flag1+flag2 == 0){printf("NO\n");}return 0;
}

这是二叉搜索树吗? 天梯赛练习 数据结构瞎做QAQ相关推荐

  1. c++判断二叉树是否为二叉搜索树_原创 | 好端端的数据结构,为什么叫它SB树呢?...

    点击上方蓝字,关注并星标,和我一起学技术. 大家好,今天给大家介绍一个很厉害的数据结构,它的名字就很厉害,叫SB树,业内大佬往往叫做傻叉树.这个真不是我框你们,而是它的英文缩写就叫SBT. SBT其实 ...

  2. 算法篇 - 二叉搜索树

    前言 在前端的工作当中,二叉搜索树不怎么常见,虽然没有快排.冒泡.去重.二分.希尔等算法常见,但是它的作用,在某些特定的场景下,是非常重要的. 目前es6的使用场景比较多,所以我准备能用es6的地方就 ...

  3. 九章基础算法04:二叉搜索树与哈希表

    目录 1. 什么是二叉搜索树 1.1 二叉搜索树结构 1.2 二叉搜索树特性应用 2. 二叉搜索树基础实现 2.1 BST类型与构造函数 2.2 插入操作 2.2.1 思路分析 2.2.2 递归实现 ...

  4. L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-004 这是二叉搜索树吗? 题目大意 给定一个长度为 nnn 的序列,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果.如果是,则在一行中输 ...

  5. 天梯赛-是否完全二叉搜索树

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

  6. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  7. L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT

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

  8. L2-004. 这是二叉搜索树吗?-PAT团体程序设计天梯赛GPLT

    一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...

  9. 中石油训练赛 - Insertion Order(二叉搜索树+构造)

    题目大意:构造出一个长度为 n 的排列,使得按照这个顺序构造出的二叉搜索树的高度为 k 题目分析:知道 n 的大小后不难算出其可以构造的二叉搜索树高度的可行范围,下限是一棵满二叉树,这个利用倍增很快就 ...

最新文章

  1. Insufficient parameters supplied to the command
  2. 南海有macbook吗?
  3. cxGrid 使用指南 1
  4. 8080处理器计算机启动
  5. Java中的状态设计模式–示例教程
  6. 这届 360 公关不行
  7. c语言全排列库函数,几种全排列的算法(C语言实现)
  8. Python练习题和答案
  9. SSD固态硬盘健康状况检测工具SSDReporter
  10. 数据结构与算法(三):链表
  11. 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8
  12. 女友升级到老婆的过程中发生的bug
  13. 【java】临时文件
  14. bw项目抱佛脚入门资料-2.按照指标创建BW数据存储对象
  15. 懒人玩Arm-2D究竟有几种姿势?
  16. 百度白皮书5.0解读如何合理设置展开全文功能
  17. python tk下拉列表_Python 窗体(tkinter)下拉列表框(Combobox)实例
  18. 煤气检测与报警程序C语言,基于单片机的煤气检测报警系统毕业设计.doc
  19. Shell语法详解专栏目录
  20. mac里python注释的快捷键_Mac 版的Python IDEL, 按什么快捷键可以快速显示上一条命令,下一条命令?...

热门文章

  1. Toolbar使用方法
  2. 编程语言中的超级英雄们
  3. A Level文科论文写作要素、结构及技巧
  4. 【转载】使用花生壳5.0在自己电脑上搭建FTP服务器
  5. PHP项目:基于php+thinkphp的在线课程学习网站(计算机毕业设计)
  6. 在Mac上怎么给文件设置密码
  7. 大连理工大学计算机专业导师,2017年大连理工大学408计算机学科专业基础综合之计算机操作系统考研导师圈点必考题汇编...
  8. Maven仓库配置163源
  9. log4j日志改json格式自定义输出内容源码及说明
  10. R语言使用K-Means聚类可视化纽约市WiFi访问