L2-004. 这是二叉搜索树吗? (二叉搜索树的性质)
L2-004. 这是二叉搜索树吗?
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数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. 这是二叉搜索树吗? (二叉搜索树的性质)相关推荐
- 【数据结构与算法】二叉堆与二叉搜索树的区别
问题描述 记得刚学习数据结构的时候,就容易混淆二叉堆和二叉搜索树,其实虽说堆也是一种完全二叉树,但二者差别还是挺大的,本文试做分析. 逻辑结构 二叉堆和二叉搜索树都是结点带权重,并在父子结点间满足某种 ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- 二叉堆与二叉堆的构建
什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...
- 魔方还原算法(二) 科先巴的二阶段算法
科先巴的二阶段算法 本文来具体介绍一种具体的魔方还原算法--科先巴的二阶段算法,有一部分相关内容在前篇讲述,主要是方向定义那一块儿,没有看的建议先看一下: 二阶段,顾名思义,解决问题分为两步,先完成一 ...
- 决策树算法模型的归类与整理(ID3&C4.5&CART&线性二分类&非线性二分类)
决策树算法模型的归类与整理(ID3&C4.5&CART&线性二分类&非线性二分类) 一. 总结摘要 决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归. ...
- 趣谈网络协议笔记-二(第十二讲)
趣谈网络协议笔记-二(第十二讲) TCP协议(下):西行必定多妖孽,恒心智慧消磨难 前言 哈哈哈,越当我看刘超的通俗讲解,我就越感觉自己的无能.每次当我看了讲解之后,每次当我感觉到这个东西原来是这么简 ...
- 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...
- ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK)
ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 # ...
- 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt
计算机图形学 二维变换及二维 第三章 二维变换及二维观察 本章主要内容 3.1二维图形的基本变换 3.2窗口视图变换 3.3复合变换 3.4二维图形裁剪 3.5本章小结 3.1 二维图形的基本变换 3 ...
最新文章
- Python计算医疗数据训练集、测试集的对应的临床特征:训练集(测试集)的阴性和阳性的样本个数、连续变量的均值(标准差)以及训练测试集阳性阴性的p值、离散变量的分类统计、比率、训练测试集阳性阴性的p值
- iOS APP安全杂谈之三
- 科大星云诗社动态20210506
- 孤掌难鸣-------堵水眼
- Java 面试之 JVM
- 基于ruby环境搭建Redmine
- 配置Apache虚拟机
- 小米5s升级Android8,小米5s、小米5s Plus升级8.0提前,好消息!
- MySQL→数据库、启动连接数据库、SQL→DDL数据定义语言及数据类型、DML数据操作语言、DQL数据查询语言、数据库约束→主键、唯一、非空、默认、外键、SQL、三大范式及一多关系、视图、内外连接
- 数据降维之多维缩放MDS(Multiple Dimensional Scaling)
- Linux虚拟机出现卡死且无法结束进程的解决办法
- 给Activity设置背景色
- 【JZOJ】【数论】立体井字棋
- socks v5 协议解析
- 码农枪击了 4 名同事后被警方击毙!后附“程序员保命指南”
- MSP430F149程序——RS485
- docker教程视频教程下载
- 九、51单片机之直流电机驱动
- 【RocketMQ】
- 各系统安装NetFrameWork3.5 安装
热门文章
- 全球最好听的100首英文歌(前50首)
- CSS3 clip-path 属性的使用示例(平行四边形的 tab按钮 / 不规则八边形弹框边角效果 / ...)不支持 IE 哦
- android视频文件能删吗,如何从Android恢复已删除的视频
- poj 3258 River Hopscotch
- App Crawler
- 微信营销20招让你粉丝过万 转载
- lib库实现UI定制化
- 非金属打包液压机卧式四柱液压机控制系统比例阀放大器
- 巅峰前的巅峰--黄山3日游
- 中企通信如何下好“东数西算”这盘棋?