L2-004. 这是二叉搜索树吗?-PAT团体程序设计天梯赛GPLT
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
其左子树中所有结点的键值小于该结点的键值;
其右子树中所有结点的键值大于等于该结点的键值;
其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数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相关推荐
- L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT
题目来源:团体程序设计天梯赛-练习集 题目地址:L2-004 这是二叉搜索树吗? 题目大意 给定一个长度为 nnn 的序列,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果.如果是,则在一行中输 ...
- L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- [Python] L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...
- L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
[CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...
- 团体程序设计天梯赛-L2组
团体程序设计天梯赛-L2组 -------------------------------------------------------------------------------- 题目传送门 ...
- 【java学习之路】(数据结构篇)004.递归和二叉搜索树
递归 递归的概念 递归的方式求1-100的和 public class DGDemo {public static int sum(int n){//递归到底的情况if(n==1){return 1; ...
- 团体程序设计天梯赛 L2 题目合集
前言 发现自己还能再参加一次天梯赛,在高兴之余,决定把在赛前将所有的天梯赛真题过一遍,希望自己可以取得理想的成绩.目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目. 本来想 L2 的题目都写个 ...
最新文章
- java StringBuffer类 常用方法
- 人工智能ai以算法为基础_智能扬声器和AI将为您的医师带来超强能力
- python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...
- Message和handler传递对象
- java的弱索引是什么_Java从零开始学 - 第76篇:什么是索引?
- js中子父级页面相互调用
- 网易用户认证架构设计 | session token | 公开课笔记-01
- 扩展kalman滤波matlab程序,扩展卡尔曼滤波算法的matlab程序
- 计算机硬件的五大逻辑部分,计算机硬件系统主要由五个部分组成?
- 大厂对ChatGPT的开发利用和评估案例收录
- oracle归档日志 delete obsolete 保留一次全备,Rman Crosscheck删除失效归档
- microbit python积木编程_TurnipBit—MicroPython开发板:从积木式编程语言开始学做小小创客...
- 不得不看的经典软件测试面试问题
- MSF开启socks代理内网渗透
- D. Equalize Them All
- 小和尚打水问题_三个和尚阅读题答案阅读题目
- 用友U9 刷新当前页面代码
- INTEL G41时序
- Java其实很简单,就这么点东西,搞来搞去十几年,网友:坐等被喷
- 计算机桌面有哪些东西吗,电脑桌面什么东西都没有了怎么办