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++)
二叉搜索树的概念 从前面讨论折半搜索的性能中可知,如果每次从搜索序列的中间进行搜索,把区间缩小一半,通过有限次迭代,很快就能通近到所要寻找的元素.进一步,如果我们直接输入搜索序列,构造出类似于折半搜索 ...
随机推荐
- node.js富文本编辑器
摘要: 最近在搭建自己的博客,这一段时间可能没有时间来写博客了,但是有了好东西还是要分享给大家.博客网站必然要有编辑文章的编辑器,所以在网上查了些资料.大部分编辑器的后台是基于java.php.asp ...
- svg文字与图像
摘要: svg与canvas一样都可以将文本和图像放在画布中,制作出不一样的效果.下面是如何使用svg来渲染文本与图像. 简介: SVG的强大能力之一是它可以将文本控制到标准HTML页面不可能有的程度 ...
- Header的Request部分和Response部分
转载:https://zh.wikipedia.org/wiki/HTTP%E5%A4%B4%E5%AD%97%E6%AE%B5#%E8%AF%B7%E6%B1%82%E5%AD%97%E6%AE%B ...
- python2和3的区别,怎么样做到轻松切换2和3
以下是菜鸟教程列举的.这些零散的改变需要注意. 下面这些东西可能平时的程序根本没用到,或者稍加注意就可以了.但2和3最主要的区别是,掌握编码. 编码在所有程序中无处不在,处理不好,要么乱码,要么编码解 ...
- Explore Basic Behavior of the TurtleBot ---3
原创博文:转载请标明出处(周学伟):http://www.cnblogs.com/zxouxuewei/tag/ Introduction 此示例帮助您使用turtlebot的自主性. 驱动机器人向前 ...
- 泛泰A870K去掉相机快门声音的方法
首先ROOT手机,挂载读写,/system/media/audio/ui里面哈,把camera-click.ogg改成camera-click.ogg.bak就可以了 转载自:http://bbs.9 ...
- Apache性能优化总结
1.介绍 首先要了解Apache采用的MPM(Multi -Processing Modules,多道处理模块),MPM是Apache的核心,它的作用是管理网络连接.调度请求.Apache2.0中MP ...
- ios开发之--MJRefresh的简单使用
MJRefresh是MJ大神写的框架,很强大,好多外国开发者都在用! 具体方法如下: -(void)requestData { NSString *userIdStr = [NSString stri ...
- python爬虫系列:做一个简单的动态代理池
自动 1.设置动态的user agent import urllib.request as ure import urllib.parse as upa import random from bs4 ...
- 先安装VS2017再安装VS2015遇到的CMake问题
先安装了VS2017,后来有需求安装VS2015,安装VS2015的时候遇到下图问题,但是控制面板里面看不到Microsoft Visual C++ 2015 Redistributable的项目 我 ...