L2-004. 这是二叉搜索树吗?

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

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

输入格式:

输入的第一行给出正整数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 这是二叉搜索树吗【递归】的更多相关文章

  1. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  2. 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

    题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...

  3. [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)

    https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...

  4. Leetcode题目98.验证二叉搜索树(递归-中等)

    题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...

  5. [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

    题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...

  6. PAT 天梯赛 L1-017. 到底有多二 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-017 AC代码 #include <iostream> #include <cstdio&g ...

  7. PAT L3-010 是否完全二叉搜索树(二叉搜索树)

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

  8. 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 ...

  9. 第33题:LeetCode255 Verify Preorder Sequence in Binary Search Tree 验证先序遍历是否符合二叉搜索树

    题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 考点 1.BST 二叉搜索树 2.递归 思路 1.后序 ...

  10. 【二叉搜索树】的详细实现(C++)

    二叉搜索树的概念 从前面讨论折半搜索的性能中可知,如果每次从搜索序列的中间进行搜索,把区间缩小一半,通过有限次迭代,很快就能通近到所要寻找的元素.进一步,如果我们直接输入搜索序列,构造出类似于折半搜索 ...

随机推荐

  1. MTK 锁屏配置

    常常我们开 发程序的时候我们不需要系统唤醒系统锁屏功能,用户有时候在看电视或视频的时候不希望系统的锁屏 功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想 ...

  2. 关于Android中Animation的停止【转载】

    转载自:http://blog.csdn.net/easonx1990/article/details/8231520 最近遇到一个需求,通过在GridView上改变焦点,并且GridView上每个i ...

  3. css媒体查询移动优先和pc优先

    移动优先,默认你是用手机浏览该网页的,当你用pc浏览时,就会以min-width进行递增式媒体查询 <!DOCTYPE html> <html lang="en" ...

  4. mysql 行转列 (case when的使用)

    现有 table1 如下 table2 如下 需要统计:各个部门每个月的绩效总和 实现如下:

  5. 获取指定ip段的所有存活主机的主机名和操作系统

    https://jingyan.baidu.com/article/ceb9fb1089fd948cad2ba000.html java探测局域网存活 https://blog.csdn.net/we ...

  6. error: pathspec 'master' did not match any file(s) known to git.

    问题描述: 在远程服务器上新建裸仓库git  --bare init : git clone裸仓库到本地: 本地新建并切换分支xccdev,git checkout -b xccdev: 从xccde ...

  7. 使用tinyproxy搭建http代理

    一.前言   二.搭建环境 * Linux laptop 2.6.32-45-generic #100-Ubuntu SMP Wed Nov 14 10:41:11 UTC 2012 i686 GNU ...

  8. [转]linux下释放文件内存

    在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. ...

  9. Ansible 使用 Playbook 管理 Nginx 配置文件

    前面我们已经安装完 Nginx,但是在日常维护中经常需要修改配置文件,并重新加载配置文件,因此来写一个管理 Nginx 配置文件的 Playbook: [root@localhost ~]$ mkdi ...

  10. [iOS] 在 ios10 中使用 imessage

    本文转载至 http://www.tuicool.com/articles/zIFvQn7   原文  http://www.bourbonz.cn/在ios10中使用imessage/ 主题 iOS ...