L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT
题目来源:团体程序设计天梯赛-练习集
题目地址:L2-004 这是二叉搜索树吗?
题目大意
给定一个长度为 nnn 的序列,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。如果是,则在一行中输出 YES ,然后在下一行输出该树后序遍历的结果,否者直接输出 NO。
题目分析
1. 预备知识
前序遍历:先访问根节点,再遍历左子树,最后遍历右子树。
后序遍历:先遍历左子树,再遍历右子树,最后访问根节点。
(注意:遍历子树的时候也要按照相应的的方式遍历。)
二叉搜索树的基本性质(如题目描述所示)
2. 结题要义
首先,我们假设输入的序列 a[]a[\ ]a[ ] 就是一棵二叉搜索树进行前序遍历的结果,lll 和 rrr 分别为序列 a[]a[\ ]a[ ] 的左右边界。
根据前序遍历的性质,我们可以知道 a[l]a[l]a[l] 即为这棵树的根节点、 l+1l+1l+1 为左子树的左边界, rrr 为右子树的右边界。然后我们定义两个指针 tltltl 、trtrtr 分别表示右子树的左边界、左子树的右边界。(注意哪个对应哪个)
初始化 tl=l+1tl = l+1tl=l+1 、tr=rtr=rtr=r,接着根据二叉树搜索树的性质 ,tltltl 往右移动,找到第一个大于或等于根节点 a[l]a[l]a[l] 的节点、trtrtr往右移动,找到第一个小于根节点 a[l]a[l]a[l] 的节点。过程如下图所示,
这样就确定了序列中根节点、左子树和右子树的位置,我们递归进行这个这个过程,就可以得到整棵树的结构,过程如下图所示:
为了简便,我们可以省去建树的过程,在确定了序列中根节点、左子树和右子树的位置后,就直接进行后序遍历。由确定子树范围的过程可得,若这是一颗二叉搜索树,则必有 tl−tr=1tl-tr=1tl−tr=1 ,要是不满足这个条件,我们就直接停止遍历。
访问根节点时,我们可以将根节点放入 vectorvectorvector 中(vectorvectorvector即为后序遍历序列)。最后我们通过判断 vectorvectorvector 中的元素个数是否等于 nnn 来判断这是否为二叉搜索树。
如果等于 nnn ,就可以输出 vectorvectorvector ;否则就判断是否为镜像。至于求判断镜像的过程也基本和上诉无异,区别在于确定子树范围的条件而已。
代码如下
#include <bits/stdc++.h>using namespace std;
const int maxn = 1e3 + 10;
int n, flag;
/*** a[]用于存储输入的前序遍历序列* ans用于存储后序遍历的结果*/
int a[maxn];
vector<int> ans;/*** 后序遍历这颗二叉树**/
void dfs(int l, int r) {if (l > r) return ;//tl表示右子树的左边界,tr表示左子树的右边界int tl = l + 1, tr = r;if (flag) {//判断二叉搜索树的“镜像”while (tl <= r && a[tl] >= a[l]) tl++;while (tr > l && a[tr] < a[l]) tr--;} else {//判断二叉搜索树while (tl <= r && a[tl] < a[l]) tl++;while (tr > l && a[tr] >= a[l]) tr--;}//不满足二叉搜索树的条件if (tl - tr != 1) return ;//访问左子树dfs(l + 1, tr);//访问右子树dfs(tl, r);//访问根节点ans.push_back(a[l]);
}int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];//先检查是不是二叉搜索树的“镜像”dfs(1, n);//如果不满足,则再检查是不是二叉搜索树if (ans.size() != n) {flag = 1;ans.clear();dfs(1, n);}if (ans.size() != n) {cout << "NO" << endl;} else {cout << "YES" << endl;for (int i = 0; i < n; i++) {cout << ans[i] << (i == n -1 ? '\n' : ' ');}}return 0;
}
如果本文对你有所帮助,记得点个赞哦~
L2-004 这是二叉搜索树吗?-团体程序设计天梯赛GPLT相关推荐
- L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...
- L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- L2-004. 这是二叉搜索树吗?-PAT团体程序设计天梯赛GPLT
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...
- [Python] L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...
- L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT
一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
[CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...
- 团体程序设计天梯赛-L2组
团体程序设计天梯赛-L2组 -------------------------------------------------------------------------------- 题目传送门 ...
- 【java学习之路】(数据结构篇)004.递归和二叉搜索树
递归 递归的概念 递归的方式求1-100的和 public class DGDemo {public static int sum(int n){//递归到底的情况if(n==1){return 1; ...
- 团体程序设计天梯赛 L2 题目合集
前言 发现自己还能再参加一次天梯赛,在高兴之余,决定把在赛前将所有的天梯赛真题过一遍,希望自己可以取得理想的成绩.目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目. 本来想 L2 的题目都写个 ...
最新文章
- pandas 遍历 series
- 超速电眼:全时成像芯片重塑机器视觉
- 1231 sqlserver_sqlserver 删除表中 指定字符串
- 【caffe-Windows】cifar实例编译之model的生成
- 按键 粘贴上一个命令_合并单元格、选择性粘贴的快捷键都是啥?今天一次告诉你……...
- java rmi 是否 必要_Java学习之路-RMI学习
- 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)
- 统计学习方法基础总结
- 无限复活服务器,绝地求生无限复活模式怎么玩 无限复活玩法说明介绍
- Hbuilder开发HTML5 APP之图标和启动页制作
- mongodb 全文搜索---ttlsa教程系列之mongodb(十)
- 用于UML前端展示的jsuml2插件
- 如何使用 Pages 在 iPhone、iPad 或 Mac 上插入和编辑表格?
- 第一讲:经典系统的基础 课后题答案解析
- c语言中为什么无法打开原文件格式,为什么vs2012无法打开源文件graphics.h和bio
- 融新聚力,筑梦畅行|云畅科技“融云计划”第一期集训营圆满结营
- # 3 网页实现吃豆子动画
- 几何光学学习笔记(30)-6.5光通量和光亮度在光学系统中的传递、像面光照度
- 软件测试自学入门书籍
- 学习笔记 time模块练习 纪念日计算
热门文章
- mk_trustonic.mk编译脚本
- ARMV8-aarch64的寄存器介绍(二)
- Android Makefile编译流程
- Intel 平台编程总结----缓存的优化
- ajax返回不刷新页面,Jquery ajax不刷新页面提交action取得返回值
- 016 Android之NDK开发
- 1.6 Number类
- 1.7 Java创建对象详解(显式创建和隐含创建)
- 春季每日一题2022 Week 1 【完结】
- java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...