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
//根据前序遍历的性质每次可以把根节点分离出来;根据二叉搜索树的性质每次可以把左右子树分开;这样在判断的时候只判断左边的是不是都小于根,右边的是不是都大于根就行了。至于后续序列,在递归左右之后,用post数组保存。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool flag = true;
int post_index = 0;
vector<int> pre(1001);
vector<int> post(1001);bool check(int l, int r)
{if (l > r)return true;int father = pre[l]; //父节点int i = l + 1, j; //i为左子树的起点if (flag) {while (i <= r && pre[i] < father)i++;j = i; // j为右子树的起点while (j <= r){if (pre[j] < father) // 题目确定右边的子树能等于父节点,其实定义里是不行的return false;j++;}}else{while (i <= r && pre[i] >= father)i++;j = i;while (j <= r){if (pre[j] >= father)return false;j++;}}if (!check(l + 1, i - 1)) // 检查左子树return false;if (!check(i, r)) // 检查右子树return false;post[post_index++] = father;return true;
}int main()
{//freopen("data.txt", "r", stdin);int N;cin >> N;for (int i = 0; i < N; i++)scanf("%d", &pre[i]);if (N == 1) {cout << "YES" << endl << pre[0] << endl;return 0;}if (pre[0] <= pre[1])flag = !flag;if (check(0, N - 1)){cout << "YES" << endl;for (int i = 0; i < post_index - 1; i++)cout << post[i] << " ";cout << post[post_index - 1] << endl;}elsecout << "NO" << endl;return 0;
}

L2-004. 这是二叉搜索树吗? (二叉搜索树的性质)相关推荐

  1. 【数据结构与算法】二叉堆与二叉搜索树的区别

    问题描述 记得刚学习数据结构的时候,就容易混淆二叉堆和二叉搜索树,其实虽说堆也是一种完全二叉树,但二者差别还是挺大的,本文试做分析. 逻辑结构 二叉堆和二叉搜索树都是结点带权重,并在父子结点间满足某种 ...

  2. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  3. 二叉堆与二叉堆的构建

    什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...

  4. 魔方还原算法(二) 科先巴的二阶段算法

    科先巴的二阶段算法 本文来具体介绍一种具体的魔方还原算法--科先巴的二阶段算法,有一部分相关内容在前篇讲述,主要是方向定义那一块儿,没有看的建议先看一下: 二阶段,顾名思义,解决问题分为两步,先完成一 ...

  5. 决策树算法模型的归类与整理(ID3&C4.5&CART&线性二分类&非线性二分类)

    决策树算法模型的归类与整理(ID3&C4.5&CART&线性二分类&非线性二分类) 一. 总结摘要 决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归. ...

  6. 趣谈网络协议笔记-二(第十二讲)

    趣谈网络协议笔记-二(第十二讲) TCP协议(下):西行必定多妖孽,恒心智慧消磨难 前言 哈哈哈,越当我看刘超的通俗讲解,我就越感觉自己的无能.每次当我看了讲解之后,每次当我感觉到这个东西原来是这么简 ...

  7. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  8. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...

  9. ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK)

    ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 # ...

  10. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt

    计算机图形学 二维变换及二维 第三章 二维变换及二维观察 本章主要内容 3.1二维图形的基本变换 3.2窗口视图变换 3.3复合变换 3.4二维图形裁剪 3.5本章小结 3.1 二维图形的基本变换 3 ...

最新文章

  1. Python计算医疗数据训练集、测试集的对应的临床特征:训练集(测试集)的阴性和阳性的样本个数、连续变量的均值(标准差)以及训练测试集阳性阴性的p值、离散变量的分类统计、比率、训练测试集阳性阴性的p值
  2. iOS APP安全杂谈之三
  3. 科大星云诗社动态20210506
  4. 孤掌难鸣-------堵水眼
  5. Java 面试之 JVM
  6. 基于ruby环境搭建Redmine
  7. 配置Apache虚拟机
  8. 小米5s升级Android8,小米5s、小米5s Plus升级8.0提前,好消息!
  9. MySQL→数据库、启动连接数据库、SQL→DDL数据定义语言及数据类型、DML数据操作语言、DQL数据查询语言、数据库约束→主键、唯一、非空、默认、外键、SQL、三大范式及一多关系、视图、内外连接
  10. 数据降维之多维缩放MDS(Multiple Dimensional Scaling)
  11. Linux虚拟机出现卡死且无法结束进程的解决办法
  12. 给Activity设置背景色
  13. 【JZOJ】【数论】立体井字棋
  14. socks v5 协议解析
  15. 码农枪击了 4 名同事后被警方击毙!后附“程序员保命指南”
  16. MSP430F149程序——RS485
  17. docker教程视频教程下载
  18. 九、51单片机之直流电机驱动
  19. 【RocketMQ】
  20. 各系统安装NetFrameWork3.5 安装

热门文章

  1. 全球最好听的100首英文歌(前50首)
  2. CSS3 clip-path 属性的使用示例(平行四边形的 tab按钮 / 不规则八边形弹框边角效果 / ...)不支持 IE 哦
  3. android视频文件能删吗,如何从Android恢复已删除的视频
  4. poj 3258 River Hopscotch
  5. App Crawler
  6. 微信营销20招让你粉丝过万 转载
  7. lib库实现UI定制化
  8. 非金属打包液压机卧式四柱液压机控制系统比例阀放大器
  9. 巅峰前的巅峰--黄山3日游
  10. 中企通信如何下好“东数西算”这盘棋?