题目来源:团体程序设计天梯赛-练习集
题目地址: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相关推荐

  1. L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT

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

  2. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  3. L2-004. 这是二叉搜索树吗?-PAT团体程序设计天梯赛GPLT

    一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...

  4. [Python] L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT

    一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...

  5. L1-017. 到底有多二-PAT团体程序设计天梯赛GPLT

    一个整数"犯二的程度"定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍. 例如数字"-13142223336& ...

  6. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码

    [CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...

  7. 团体程序设计天梯赛-L2组

    团体程序设计天梯赛-L2组 -------------------------------------------------------------------------------- 题目传送门 ...

  8. 【java学习之路】(数据结构篇)004.递归和二叉搜索树

    递归 递归的概念 递归的方式求1-100的和 public class DGDemo {public static int sum(int n){//递归到底的情况if(n==1){return 1; ...

  9. 团体程序设计天梯赛 L2 题目合集

    前言 发现自己还能再参加一次天梯赛,在高兴之余,决定把在赛前将所有的天梯赛真题过一遍,希望自己可以取得理想的成绩.目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目. 本来想 L2 的题目都写个 ...

最新文章

  1. pandas 遍历 series
  2. 超速电眼:全时成像芯片重塑机器视觉
  3. 1231 sqlserver_sqlserver 删除表中 指定字符串
  4. 【caffe-Windows】cifar实例编译之model的生成
  5. 按键 粘贴上一个命令_合并单元格、选择性粘贴的快捷键都是啥?今天一次告诉你……...
  6. java rmi 是否 必要_Java学习之路-RMI学习
  7. 深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)
  8. 统计学习方法基础总结
  9. 无限复活服务器,绝地求生无限复活模式怎么玩 无限复活玩法说明介绍
  10. Hbuilder开发HTML5 APP之图标和启动页制作
  11. mongodb 全文搜索---ttlsa教程系列之mongodb(十)
  12. 用于UML前端展示的jsuml2插件
  13. 如何使用 Pages 在 iPhone、iPad 或 Mac 上插入和编辑表格?
  14. 第一讲:经典系统的基础 课后题答案解析
  15. c语言中为什么无法打开原文件格式,为什么vs2012无法打开源文件graphics.h和bio
  16. 融新聚力,筑梦畅行|云畅科技“融云计划”第一期集训营圆满结营
  17. # 3 网页实现吃豆子动画
  18. 几何光学学习笔记(30)-6.5光通量和光亮度在光学系统中的传递、像面光照度
  19. 软件测试自学入门书籍
  20. 学习笔记 time模块练习 纪念日计算

热门文章

  1. mk_trustonic.mk编译脚本
  2. ARMV8-aarch64的寄存器介绍(二)
  3. Android Makefile编译流程
  4. Intel 平台编程总结----缓存的优化
  5. ajax返回不刷新页面,Jquery ajax不刷新页面提交action取得返回值
  6. 016 Android之NDK开发
  7. 1.6 Number类
  8. 1.7 Java创建对象详解(显式创建和隐含创建)
  9. 春季每日一题2022 Week 1 【完结】
  10. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...