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
emmm感觉数据结构好像学了都忘掉了
关于二叉树怎么建怎么遍历不是很熟悉了
算是很好的一道复习的题目
递归建树 递归遍历
然而还是看了题解
第一个思路是先建树 然后对这个树前序遍历 和原来的数组比较
然后再后序遍历树
有一组段错误 应该是runtime error
大概是递归太多爆栈了?
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
int n;
int vis[10005];
int tree[10005];
int num[10005];
void build(int rt, int x)
{
if(!vis[rt]){
vis[rt] = true;
tree[rt] = x;
return ;
}
if(x >= tree[rt]){
build(2 * rt + 1, x);
}
else{
build(2 * rt, x);
}
}
bool flag;
int cnt;
void qianxv(int k)
{
if(flag == 0)return ;
if(tree[k] == num[cnt]){
cnt++;
if(vis[2 * k]) qianxv(2 * k);
if(vis[2 * k + 1]) qianxv(2 * k + 1);
}
else
flag = 0;
return;
}
void re_qianxv(int k)
{
if(flag == 0) return ;
if(tree[k] == num[cnt]){
cnt++;
if(vis[2 * k + 1])re_qianxv(2 * k + 1);
if(vis[2 * k])re_qianxv(2 * k);
}
else flag = 0;
return ;
}
void print(int k)
{
if(vis[2 * k])print(2 * k);
if(vis[2 * k + 1]) print(2 * k + 1);
if(k == 1){
printf("%d\n", tree[k]);
}
else{
printf("%d ", tree[k]);
}
return;
}
void reprint(int k)
{
if(vis[2 * k + 1])reprint(2 * k + 1);
if(vis[2 * k])reprint(2 * k);
if(k == 1){
printf("%d\n", tree[k]);
}
else{
printf("%d ", tree[k]);
}
return;
}
int main()
{
while(cin>>n){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++){
cin>>num[i];
build(1, num[i]);
}
flag = true;
cnt = 1;
qianxv(1);
if(flag){
printf("YES\n");
print(1);
}
else{
flag = true;
cnt = 1;
re_qianxv(1);
if(flag){
printf("YES\n");
reprint(1);
}
else{
printf("NO\n");
}
}
}
return 0;
}
第二个思路是区间递归
前序的话根节点肯定在前面 然后后面跟了一段都比他小 在后面跟了一段都比他大 找到那个分界点
类似于快排的partition?
如果找到那个点 两段中间还差一大段说明这个不是前序遍历的
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
int n;
int num[1005];
bool isMirror;
vector<int>tree;
void f(int l, int r)
{
if(l > r) return;
int tr = l + 1;//tr - r是右子树
int tl = r;//l + 1 - tl是左子树
if(!isMirror){
while(tr <= r && num[tr] < num[l]) tr++;
while(tl > l && num[tl] >= num[l]) tl--;
}
else{
while(tr <= r && num[tr] >= num[l]) tr++;
while(tl > l && num[tl] < num[l]) tl--;
}
if(tr - tl != 1) return;
f(l + 1, tl);
f(tr, r);
tree.push_back(num[l]);
}
int main()
{
while(cin>>n){
tree.clear();
for(int i = 0; i < n; i++){
cin>>num[i];
}
isMirror = 0;
f(0, n - 1);
if(tree.size() != n){
isMirror = 1;
tree.clear();
f(0, n - 1);
}
if(tree.size() != n){
printf("NO\n");
}
else{
printf("YES\n%d", tree[0]);
for(int i = 1; i < n; i++){
printf(" %d", tree[i]);
}
cout<<endl;
}
}
return 0;
}
PAT天梯赛L2-004 这是二叉搜索树吗【递归】的更多相关文章
- PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
- [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)
https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...
- Leetcode题目98.验证二叉搜索树(递归-中等)
题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...
- [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)
题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...
- PAT 天梯赛 L1-017. 到底有多二 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-017 AC代码 #include <iostream> #include <cstdio&g ...
- PAT L3-010 是否完全二叉搜索树(二叉搜索树)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 第33题:LeetCode255 Verify Preorder Sequence in Binary Search Tree 验证先序遍历是否符合二叉搜索树
题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 考点 1.BST 二叉搜索树 2.递归 思路 1.后序 ...
- 【二叉搜索树】的详细实现(C++)
二叉搜索树的概念 从前面讨论折半搜索的性能中可知,如果每次从搜索序列的中间进行搜索,把区间缩小一半,通过有限次迭代,很快就能通近到所要寻找的元素.进一步,如果我们直接输入搜索序列,构造出类似于折半搜索 ...
随机推荐
- SQL Compare数据库比较工具 完全破解+使用教程
来源http://www.cnblogs.com/duci/articles/4482665.html 一.使用教程 SQL Compare是编程人员常用的比较两个数据库之间差异的工具.可以用来比较数 ...
- 一份比较全面的PHP开发编码规范.
这些年来多从事Linux下PHP和C相关的开发,带过很多项目和团队,下面是根据经验整理的PHP编码规范,可以用作给大家的范例和参考,根据需要进行取舍和修改! (可能最新的一些php5的规范不够完整,今 ...
- NYOJ 116 士兵杀敌 (线段树,区间和)
题目链接:NYOJ 116 士兵杀敌 士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的 ...
- ant 打批量渠道包,第三方项目作为library打包出错的问题
ant批量打包不解释了.详情请看前面其它的blog! 这里说一下 开发中,非常可能遇到引用第三方的项目作为library情况.这样的情况下该怎么打包呢? 第一:改动build.xml 第二:在init ...
- (转)base64编码是怎么工作的?
按:在PHP中级班的课堂上,有位同学问这样一个问题:“我在用 base64_encode 对用户名进行编码时,会出来等号,是不是可以去掉?”跟我来看完这篇文章,答案即揭晓. 1: 为什么需要base6 ...
- C#中的Abstract、Virtual、Interface理解
容易混淆是必须的,都是与继承有关系,并且涉及到override的使用 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中 ...
- NTP服务器时间集群借节点之间同步
1.三个节点时间同步,cdh1,cdh2,cdh3 2.做法:cdh1从网络时间同步,然后cdh2和cdh3从cdh1节点同步 3.安装与自启动设置 yum install ntp 按上面的安装方式在 ...
- window下JBoss7 安装部署
0x01 下载安装 1.下载地址: http://www.jboss.org/jbossas/downloads 2.解压缩:选择一个安装目录解压 jboss-as-7.1.1.Final.zip 3 ...
- metasploit 中的DB
渗透测试任务中,主机/服务/漏洞等信息如果手动维护,会带来巨大的工作量. 在metasploit中,这部分工作已经被封装的非常好,每次调用内部模块执行的任务结果都会自动存入DB.通过简单的指令即可以方 ...
- Linux命令之乐--wget
常见参数: 参数 作用 -b 后台下载模式. -P 下载到指定目录. -t 最大尝试次数. -c 断点续传 -p 下载页面内所有资源,包括图片.视频等. -r 递归下载 实例1,下载本站的所有文章 ...