一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
其左子树中所有结点的键值小于该结点的键值;
其右子树中所有结点的键值大于等于该结点的键值;
其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

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

输入格式:

输入的第一行给出正整数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

分析:假设它是二叉搜索树,一开始isMirror为FALSE,根据二叉搜索树的性质将已知的前序转换为后序,转换过程中,如果发现最后输出的后序数组长度不为n,那就设isMirror为true,然后清空后序数组,重新再转换一次(根据镜面二叉搜索树的性质),如果依旧转换后数组大小不等于n,就输出NO否则输出YES

#include <cstdio>
#include <vector>
using namespace std;
bool isMirror;
vector<int> pre;
vector<int> post;
void getpost(int root, int tail) {if(root > tail) return ;int i = root + 1, j = tail;if(!isMirror) {while(i <= tail && pre[root] > pre[i]) i++;while(j > root && pre[root] <= pre[j]) j--;} else {while(i <= tail && pre[root] <= pre[i]) i++;while(j > root && pre[root] > pre[j]) j--;}if(i - j != 1) return ;getpost(root + 1, j);getpost(i, tail);post.push_back(pre[root]);
}
int main() {int n;scanf("%d", &n);pre.resize(n);for(int i = 0; i < n; i++)scanf("%d", &pre[i]);getpost(0, n - 1);if(post.size() != n) {isMirror = true;post.clear();getpost(0, n - 1);}if(post.size() == n) {printf("YES\n%d", post[0]);for(int i = 1; i < n; i++)printf(" %d", post[i]);} else {printf("NO");}return 0;
}

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

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

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

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

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

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

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

  4. [Python] L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT

    一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...

  5. L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT

    一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...

  6. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...

  7. 团体程序设计天梯赛-L2组

    团体程序设计天梯赛-L2组 -------------------------------------------------------------------------------- 题目传送门 ...

  8. 【java学习之路】(数据结构篇)004.递归和二叉搜索树

    递归 递归的概念 递归的方式求1-100的和 public class DGDemo {public static int sum(int n){//递归到底的情况if(n==1){return 1; ...

  9. 团体程序设计天梯赛 L2 题目合集

    前言 发现自己还能再参加一次天梯赛,在高兴之余,决定把在赛前将所有的天梯赛真题过一遍,希望自己可以取得理想的成绩.目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目. 本来想 L2 的题目都写个 ...

最新文章

  1. java StringBuffer类 常用方法
  2. 人工智能ai以算法为基础_智能扬声器和AI将为您的医师带来超强能力
  3. python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
  4. Message和handler传递对象
  5. java的弱索引是什么_Java从零开始学 - 第76篇:什么是索引?
  6. js中子父级页面相互调用
  7. 网易用户认证架构设计 | session token | 公开课笔记-01
  8. 扩展kalman滤波matlab程序,扩展卡尔曼滤波算法的matlab程序
  9. 计算机硬件的五大逻辑部分,计算机硬件系统主要由五个部分组成?
  10. 大厂对ChatGPT的开发利用和评估案例收录
  11. oracle归档日志 delete obsolete 保留一次全备,Rman Crosscheck删除失效归档
  12. microbit python积木编程_TurnipBit—MicroPython开发板:从积木式编程语言开始学做小小创客...
  13. 不得不看的经典软件测试面试问题
  14. MSF开启socks代理内网渗透
  15. D. Equalize Them All
  16. 小和尚打水问题_三个和尚阅读题答案阅读题目
  17. 用友U9 刷新当前页面代码
  18. INTEL G41时序
  19. Java其实很简单,就这么点东西,搞来搞去十几年,网友:坐等被喷
  20. 计算机桌面有哪些东西吗,电脑桌面什么东西都没有了怎么办

热门文章

  1. 通过JDBC和Hibernate对Clob和Blob的操作
  2. 荣耀Magic 2 3D感光版来了,和苹果Face ID系统有何不同?
  3. MS CRM 2011 Audit
  4. selenium常用获取元素点
  5. fidder设置断点,修改请求参数等
  6. 【转】Dubbo架构设计详解
  7. [Android自定义控件] Android Scroller工具类和GestureDetector的简单用法
  8. MaxScale初探
  9. Realtek WiFi SDK 被曝多个漏洞,影响供应链上至少65家厂商近百万台IoT设备
  10. 呐,一个苹果洞赚10万美元的详细经验都在这里了~