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. Smallest Difference(暴力全排列)

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10387   Accepted: 2 ...

  2. grid响应式布局

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. C++ 枚举转字符串

    用#宏,见代码 #include <iostream> #define enum_to_string(x) #x enum sex { boy, girl, }; int main() { ...

  4. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

  5. {"errorCode":50} 的解决办法

    # 无反爬 import urllib.parse import urllib.request import json content = input('请输入需要翻译的词语:') # url = ' ...

  6. 子窗口访问父页面iframe中的iframe,top打开的子窗口访问父页面中的iframe中的iframe

    子窗口访问父页面iframe中的iframe 子窗口访问最顶层页面中的iframe中的iframe top打开的子窗口访问父页面中的iframe中的iframe top打开的子窗口访问最顶层页面中的i ...

  7. ckeditor 添加插件

    官方插件包列表:https://ckeditor.com/cke4/addons/plugins/all 添加插件方法: 1)下载插件包(如果插件包有依赖其他插件,则依赖包也需要下载) 2)解压插件包 ...

  8. ASPX代码加固小结

    1.replace替换 <%@Page Language="C#"%> <% string strID=Request["id"]; strI ...

  9. Outlook 2007 实现自动添加密送的方法

    1)在Outlook里面键入Alt+F11打开VBA编辑器:     2)激活左边的工程面板,展开并双击上面的“Project (VbaProject.OTM)/Microsoft Office Ou ...

  10. iOS开发-- 设置UIButton的文字显示位置、字体的大小、字体的颜色

    btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlS ...