团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗
L2-004. 这是二叉搜索树吗?
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数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
思路:我们只需要提炼题意几个关键词,首先是根据二叉搜索树的三个特点建树,
也顺便将其镜像树(原来放左边的放右边)写出来,
然后对比一下其前序遍历是不是对应给出的数列,是就输出其后序遍历的数列。
- #include<bits/stdc++.h>
- using namespace std;
- //二叉搜索树特点:左节点比根节点小,右节点比根节点大
- struct Node{
- int data;
- struct Node *l;
- struct Node *r;
- };
- int s[],v[],tmp;
- void create1(Node *root,int x){//建树
- Node *p;
- if(x<root->data){
- if(root->l==NULL){
- p=new Node;
- p->data=x;
- p->l=NULL;
- p->r=NULL;
- root->l=p;
- return ;
- }
- else
- create1(root->l,x);
- }
- else{
- if(root->r==NULL){
- p=new Node;
- p->data=x;
- p->l=NULL;
- p->r=NULL;
- root->r=p;
- return ;
- }
- else
- create1(root->r,x);
- }
- }
- void create2(Node *root,int x){//镜像树
- Node *p;
- if(x>=root->data){
- if(root->l==NULL){
- p=new Node;
- p->data=x;
- p->l=NULL;
- p->r=NULL;
- root->l=p;
- return ;
- }
- else
- create2(root->l,x);
- }
- else{
- if(root->r==NULL){
- p=new Node;
- p->data=x;
- p->l=NULL;
- p->r=NULL;
- root->r=p;
- return ;
- }
- else
- create2(root->r,x);
- }
- }
- void firstvisit(Node *p){//前序遍历:根左右
- if(p!=NULL){
- v[tmp++]=p->data;
- firstvisit(p->l);
- firstvisit(p->r);
- }
- }
- void lastvisit(Node *p){//后序遍历:左右根
- if(p!=NULL){
- lastvisit(p->l);
- lastvisit(p->r);
- v[tmp++]=p->data;
- }
- }
- int main(){
- int n,flag;
- Node *root,*toor;
- root=NULL;
- scanf("%d",&n);
- for(int i=;i<n;i++){
- scanf("%d",&s[i]);
- if(i==)//根节点
- {
- root=new Node;
- root->data=s[i];
- root->l=NULL;
- root->r=NULL;
- toor=new Node;
- toor->data=s[i];
- toor->l=NULL;
- toor->r=NULL;
- }
- else{
- create1(root,s[i]);
- create2(toor,s[i]);
- }
- }
- tmp=;
- flag=;
- firstvisit(root);
- for(int i=;i<n;i++){
- if(s[i]!=v[i]){
- flag=;
- break;
- }
- }
- if(flag==){
- printf("YES\n");
- tmp=;
- lastvisit(root);
- printf("%d",v[]);
- for(int i=;i<n;i++)
- printf(" %d",v[i]);
- }
- else{
- tmp=;
- flag=;
- firstvisit(toor);
- for(int i=;i<n;i++){
- if(s[i]!=v[i]){
- flag=;
- break;
- }
- }
- if(flag==){
- printf("YES\n");
- tmp=;
- lastvisit(toor);
- printf("%d",v[]);
- for(int i=;i<n;i++)
- printf(" %d",v[i]);
- }
- else
- printf("NO\n");
- }
- return ;
- }
团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗的更多相关文章
- 团体程序设计天梯赛-练习集L1-017. 到底有多二
L1-017. 到底有多二 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个整数“犯二的程度”定义为该数字中包含2的个数与其 ...
- PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...
- PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集
L2-023 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解 ...
- 团体程序设计天梯赛-练习集L2-010. 排座位
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- 团体程序设计天梯赛-练习集 L1-007 念数字
- - ->博主推荐,学生党.程序员必备,点击查看- - - >>>>> 热门文章推荐 以下50道算法编程题访问量较大,包含常用语法,数据结构,解题思路等等,作为C ...
- 团体程序设计天梯赛-练习集L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- PTA L2-002 链表去重 团体程序设计天梯赛-练习集
L2-002 链表去重(25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...
- 团体程序设计天梯赛-练习集-L1-045. 宇宙无敌大招呼
L1-045. 宇宙无敌大招呼 据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼.作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼 ...
- 团体程序设计天梯赛-练习集-*L1-043. 阅览室
L1-043. 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过100 ...
随机推荐
- Cocos2d-x优化中关于背景图片优化
由于背景图片长时间在场景中保存,而且图片很多,我们可以对其进行一些优化.我们通过如下几个方面考虑优化:1.不要Alpha通道背景图片的特点是不需要透明的,所以纹理格式可以采用不带有Alpha通道格式, ...
- iOS开发——锁屏监听
公司所做的项目,锁屏监听是为了60秒后,解锁瓶后显示[手势解锁]或[指纹验证]: 第一步:AppDelegate.m 头部导入 #import <notify.h> #define Not ...
- 读<<CLR via C#>> 详谈泛型
1,什么是泛型? 答:泛型是类型的模板,类型是实例(对象)的模板.C#提供了5种泛型:类,接口,委托,结构和方法. 2,使用泛型有什么好处? 答:继承实现的是"代码重用",而泛型实 ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- 按按钮调用PHP function函数
首先,请大家看一段HTML代码: <html> <head> </head> <body> <input type=button on_click ...
- 将C# dataTable 做为参数传入到存储过程
1.list转换为DataTable(如果有需要) public static DataTable ListToDataTable<T>(List<T> entitys) { ...
- C++ 对数组sizeof 和对数组元素sizeof
这一段程序 下面这段程序很有看点://arr1 is an array of intsint *source=arr1;size_t sz=sizeof(arr1)/sizeof(*arr1);//n ...
- input onfocus onblur
<input type="text" style="color:#999" value="账户" onfocus='if(this.v ...
- 《Visual C++ 程序设计》读书笔记 ----第8章 指针和引用
1.&取地址:*取内容. 2.指针变量“++”“--”,并不是指针变量的值加1或减1,而是使指针变量指向下一个或者上一个元素. 3.指针运算符*与&的优先级相同,左结合:++,--,* ...
- [旧博客]QQ旋风加速漏洞
漏洞是这样的,用开通QQ会员的账号登录QQ旋风,添加要下载的任务,启动加速后,注销,登录lixian.qq.com 删除刚才添加的离线任务,这时QQ旋风还是在加速那个任务.而你又可以登录QQ旋风添加其 ...