PAT (天梯)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 <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
int num,left,right;
}tree[];
int i,j,n;
int a[],b[],l;
void buildtree(int k)
{
if (k>n) return;
tree[++l].num=a[k];
tree[l].left=-;
tree[l].right=-;
int i=;
while()
{
while(a[k]<tree[i].num && tree[i].left!=-) i=tree[i].left;
if (tree[i].left==- && a[k]<tree[i].num)
{
tree[i].left=l;
break;
}
while(a[k]>=tree[i].num && tree[i].right!=-) i=tree[i].right;
if (tree[i].right==- && a[k]>=tree[i].num)
{
tree[i].right=l;
break;
}
}
buildtree(k+);
return ;
}
void work1(int k)
{
b[++l]=tree[k].num;
if (tree[k].left!=-) work1(tree[k].left);
if (tree[k].right!=-) work1(tree[k].right);
return;
}
void work2(int k)
{
b[++l]=tree[k].num;
if (tree[k].right!=-) work2(tree[k].right);
if (tree[k].left!=-) work2(tree[k].left);
return;
}
void cal1(int k)
{
if (tree[k].left!=-) cal1(tree[k].left);
if (tree[k].right!=-) cal1(tree[k].right);
b[++l]=tree[k].num;
return;
}
void cal2(int k)
{
if (tree[k].right!=-) cal2(tree[k].right);
if (tree[k].left!=-) cal2(tree[k].left);
b[++l]=tree[k].num;
return;
}
int main()
{
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]); tree[].num=a[];
tree[].left=-;
tree[].right=-;
l=;
buildtree();
//for(i=1;i<=n;i++)
// printf("%d:%d %d\n",tree[i].num,tree[tree[i].left].num,tree[tree[i].right].num);
l=;
memset(b,,sizeof(b));
work1(); for(i=;i<=n;i++)
if (a[i]!=b[i]) break;
if(i>n) {
printf("YES\n");
memset(b,,sizeof(b));
l=;
cal1();
for(i=;i<n;i++) printf("%d ",b[i]);
printf("%d\n",b[n]);
}
else
{
l=;
memset(b,,sizeof(b));
work2();
for(i=;i<=n;i++)
if (a[i]!=b[i]) break;
if (i>n) {
printf("YES\n");
memset(b,,sizeof(b));
l=;
cal2();
for(i=;i<n;i++) printf("%d ",b[i]);
printf("%d\n",b[n]);
}
else printf("NO\n");
}
return ;
}
PAT (天梯)L2-004. 这是二叉搜索树吗?的更多相关文章
- PAT 天梯赛 L2-004 这是二叉搜索树吗?
递归判断+建树 题目链接:https://www.patest.cn/contests/gplt/L2-004 题解 二叉搜索树的特点就是其根节点的值是位于左右子树之间的,即大于左子树的所有值,但是小 ...
- PAT天梯赛L2-004 这是二叉搜索树吗【递归】
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】
题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...
- pat 团体天梯赛 L3-010. 是否完全二叉搜索树
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- pat 团体天梯赛 L2-004. 这是二叉搜索树吗?
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- 团体程序设计天梯赛L3-010 是否完全二叉搜索树 2017-03-24 16:12 29人阅读 评论(0) 收藏
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- PAT 天梯赛 是否完全二叉搜索树 (30分)(二叉搜索树 数组)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
随机推荐
- MySQL5.7以上开启binlog
在my.cnf的mysqld下加入: server_id = 0 log_bin=/harddisk/mysql_data/mysql_binlog/mysql-bin binlog_format ...
- angular项目——小小记事本2
一,路由的规划. 需要模拟的页面有三个:all,active,conplete. 首先,写好铺垫需要的各种东西,重要的组件的引用等—— 这里我们会将index.html设为主页,将body.html加 ...
- Android任务栈TaskStack
Task:有多个Activity按顺序组成的一个完整的业务逻辑. 任务栈(TaskStack):新增的Activity放入栈中,点击back栈顶Activity从栈中退出. android:nohis ...
- 说说final关键字(好像有干货)
在java开发过程中,final是大家常用的关键字,无非就是用来修饰类,方法和变量,来表名类不能被继承,方法不会被覆盖,变量不能被改变,悄悄的说一句,private方法也隐式的final.通过一段时间 ...
- JavaScript高级程序设计:第十章
一.理解包含不同层次节点的DOM 1.节点层次 以下面的HTML为例: <html> <head> <title>Sample Page</title> ...
- hdu_1495_非常可乐(bfs模拟)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意:不解释 题解:BFS模拟,不过要细心,把所有情况都列举出来,开一个数组记录状态,代码有点长 ...
- 授权给指定用户,使用navicat在其他ip都可以连接linux服务器上的mysql库
grant all privileges on ao.* to 'tony'@'localhost' identified by '123456'; 在ao库中所有表. 同意 ,授权 给ton ...
- SQL Server 存储过程进行分页查询
CREATE PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage INT = 1 , --当前页页码 (即Top currPage) @showColum ...
- 命令 shell 学习
for i in a b c do echo $i done !ser 历史补全 > 正确信息输出文件 >>正确信息输出文件 ,追加 2>错误信息输出文件 2>> ...
- iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?
初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变. 那时编写iOS的App( ...