L2-004 这是二叉搜索树吗? (25 分) (树)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192
题目:
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数 N(≤)。随后一行给出 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
题意:
定义了二叉搜索树 给出了一个前序遍历 判断这个前序遍历是不是一棵二叉树搜索树或者二叉搜索树的镜像的前序遍历 如果是 输出这棵树的后序遍历 思路:
对二叉搜索树及其镜像分别建树 并进行判断
二叉搜索树表示为 根结点的左儿子小于它 而右儿子大于等于它 前序遍历(l,r)中的l为根结点rt 在(l+1,r)的两端分别设两个指针p1,p2向内靠近判断哪边为左儿子区间 哪边为右儿子区间
如果p2-p1!=1 表示不能完全分隔成两个区域 即这个前序遍历不合法
二叉搜索树镜像如上
在判断过程中 直接用后序遍历的顺序去建树 最后输出即可
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int maxn=;
int n,flag;
int pr[maxn]; vector<int>v; void find(int l,int r){
if(l>r) return;
int tl=l+,tr=r;
if(!flag){
while(tl<=r && pr[tl]<pr[l]) tl++;
while(tr>l && pr[tr]>=pr[l]) tr--;
}
else{
while(tl<=r && pr[tl]>=pr[l]) tl++;
while(tr>l && pr[tr]<pr[l]) tr--;
}
if(tl-tr!=) return;
find(l+,tr);
find(tl,r);
v.push_back(pr[l]);
} int main(){
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&pr[i]);
find(,n-);
if(v.size()!=n){
flag=;
v.clear();
find(,n-);
}
if(v.size()!=n) printf("NO\n");
else{
printf("YES\n");
for(int i=;i<n;i++){
printf("%d%c",v[i],i==(n-)?'\n':' ');
}
}
return ;
}
L2-004 这是二叉搜索树吗? (25 分) (树)的更多相关文章
- PTA 是否同一棵二叉搜索树(25 分)
是否同一棵二叉搜索树(25 分) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始 ...
- 二叉搜索树的平衡--AVL树和树的旋转(图解)
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- 二叉搜索树的平衡--AVL树和树的旋转
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- 04-树4 是否同一棵二叉搜索树(25 point(s)) 【Tree】
04-树4 是否同一棵二叉搜索树(25 point(s)) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和 ...
- PTA 7-2 是否完全二叉搜索树(30 分) 二叉树
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- LeetCode动画 | 1038. 从二叉搜索树到更大和树
今天分享一个LeetCode题,题号是1038,标题是:从二分搜索树到更大和数. 题目描述 给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等 ...
- 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)
树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...
- 二叉搜索树TREE(线段树,区间DP)
前言 线段树+区间DP题,线段树却不是优化DP的,是不是很意外? 题面 二叉搜索树是一种二叉树,每个节点都有一个权值,并且一个点的权值比其左子树里的点权值都大,比起右子树里的点权值都小. 一种朴素的向 ...
- Java二叉搜索树实现
树集合了数组(查找速度快)和链表(插入.删除速度快)的优点 二叉树是一种特殊的树,即:树中的每个节点最多只能有两个子节点 二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的 ...
- 二叉搜索树(BST)
(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...
随机推荐
- ABP之什么是ABP(ASP.NET Boilerplate)
1.介绍 ABP是开源的且文档比较齐全的应用程序框架.其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型. ABP支持最新的ASP.NET Core和EF C ...
- Photoshop调出田园照片唯美手绘油画效果
先看看效果图 原片分析:妹子脸上的光不够通透,有些灰暗,整体色调不够分明. 后期思路:色彩往油画风格调整,让画面色彩更加油润.丰富. 基础调整 (1)曝光根据照片的实际情况进行调整 (2)增加阴影部分 ...
- golang异常处理
一.使用defer+recover 错误例子: [root@localhostgo_test]#cat t1.go package main func main(){ panic(1) } [root ...
- mock详解
一.Mock在单元测试中扮演一个什么角色 有时,你需要为单元测试的初始设置准备一些“其他”的代码资源.但这些资源兴许会不可用,不稳定,或者是使用起来太笨重.你可以试着找一些其他的资源替代:或者你可以通 ...
- macTypeError: slice indices must be integers or None or have an index method
一般是由于Numpy的版本太高了(1.12对此进行了调整),有的时候传入numpy array里面的索引可能是浮点数,这个时候最好检查一下索引强制转换为int类型 或者安装低版本的numpy sudo ...
- Java编程思想_笔记_第二章_一切都是对象
第二章对于知识只是点到,会在以后章节会详细展开. 笔记的侧重会偏向记录自己知识模糊的地方.比如 xxx 很重要很难很实用,但是已经熟练使用就没有记录,而 “使用对象.成员名称来使用成员变量”,较简单而 ...
- 堆以及一些用法 QWQ这是写得最认真的板子题
最近一直在学图论,然后吧,由于学的东西实在是太多太杂了,加上蒟蒻本蒻又经常颓,所以落了好多好多板子题的整理没写啊嘤嘤嘤,不过把这些东西学的差不多了,再一块写个整理,其实感觉还不错?????也算是很神奇 ...
- STDIN_FILENO和stdin
title: STDIN_FILENO和stdin date: 2019/03/15 22:03:22 toc: true --- STDIN_FILENO和stdin https://blog.cs ...
- Linux(Centos)设置ip
一.Linux(Centos7)安装完毕后,重启电脑后,输入用户名(root),密码(**********). 在命令行中输入nmtui命令.选择Edit a connection,选择对应的链接端口 ...
- EF Code First关系规则及配置
1.一对多关系 关系表: Category 分类表 Product 产品表 分类与产品之间的一对多关系 1>.产品实体类不指定外键属性 Domain中类定义: Category.cs 1 usi ...