【小浩算法 BST与其验证】

BST与其验证

  • 前言
  • 我的思路
    • 思路一 中序遍历+判断数组无重复递增
    • 思路二 递归+边界最大值最小值的传递
  • 我的代码
    • 测试用例1
    • 测试用例2

前言

BST是二叉树一个经典应用,我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树,应该还算是基础题吧。

我的思路

其实最开始这个题目我的思路并不清晰,基本上只能想到去用递归,但是如何去构建递归的子问题,我想不太到,哈哈哈还是算法小白呢,想不到很正常(偷偷安慰自己…)。思路学习链接:
小浩算法-BST验证
力扣–验证二叉搜索树【98】

思路一 中序遍历+判断数组无重复递增

这个思路我觉得很巧妙,因为它利用了一个特性:二叉搜索树的中序遍历得到的一定是一个完全递增的序列(我们考虑的是二叉树里面无重复值),随后我们只需要判断一下遍历的结果是否严格递增就好了。总结一下:

  • 先中序遍历BST把结果存储在一个vector里面。
  • 判断该vector是否严格递增。
//验证是否为二叉搜索树void isBST(node* root) {//先创建一个数组vector<char> midOrderArr;midOrder(root, midOrderArr);//输出看一下我的数组里面存的是不是中序遍历的值for (int i = 0; i < midOrderArr.size(); i++) {cout << midOrderArr[i] << ' ';}cout << endl;for (int i = 0; i < midOrderArr.size()-1; i++) {if (midOrderArr[i] >= midOrderArr[i + 1]) {cout << "该二叉树 不是一颗二叉搜索树!" << endl;return;}}cout << "该二叉树 是一颗二叉搜索树!" << endl;}//二叉树的中序遍历void midOrder(node* root,vector<char>& Arr) {if (root == nullptr) {return;}midOrder(root->left, Arr);Arr.push_back(root->info);midOrder(root->right, Arr);}

思路二 递归+边界最大值最小值的传递

这个题目有一个很有意思的陷阱,那就是我们不光要求 一个结点的左孩子比它小,右孩子比它大。我们要求的是,这个结点的左子树上的所有结点都比它小,右子树上的所有结点都比他大

因此在递归的时候,我们需要一个上界和下界
首先需要考虑初始化的问题,这里我们用到climits库里面的LONG_MAX和LONG_MIN.代表long long 类型的最大值和最小值。
递归左子树,上界是根节点的值,下界就选上一层的min ;递归右子树,下界是根节点的值,上界就选上一层的max。perfect!完美!

bool isBST_Recursion(node* root,long long min,long long max) {if (root == nullptr) {return true;}if (root->info <= min || root->info >=max) {//cout << "该二叉树不是一个二叉搜索树";return false;}return isBST_Recursion(root->left, min, root->info) && isBST_Recursion(root->right, root->info, max);}

我的代码

测试用例1

1248##9##5##36##7##

在这里插入图片描述

测试用例2

421##3##65##7##

在这里插入图片描述

#include <iostream>
#include<algorithm>
#include<cmath>
#include <queue> 
#include<climits>
using namespace std;struct node {char info;node* left;node* right;node(char data) :info(data), left(nullptr), right(nullptr) {};node() :info(NULL), left(nullptr), right(nullptr) {};
};class binaryTree {
private:node* root;
public:binaryTree() {root = new node(NULL);}//得到树的根结点node* getRoot() {return root;}//以递归的方式构建一棵树void createTree(node*& t) {char str;cin >> str;if (str == '#') {t = NULL;}else {t = new node;//为t开辟空间t->info = str;createTree(t->left);createTree(t->right);}}//树的深度int depth(node* root) {if (root == nullptr) {return 0;}int left = depth(root->left);int right = depth(root->right);return max(left, right) + 1;}//打印一棵树满二叉树,只能打印满二叉树,节点数目最好不要超过10void print(node*& root) {//存放打印的二叉树char str[10][100] = {};queue<node*> q;int h = depth(root);q.push(root);int index = 0;while (!q.empty()) {int size = q.size();//存放每一层的节点vector<char> list;for (int i = 0; i < size; i++) {node* temp = q.front();q.pop();list.push_back(temp->info);//cout << temp->info;if (temp->left != nullptr) {q.push(temp->left);}if (temp->right != nullptr) {q.push(temp->right);}}bool flag = true;int j = 0;//打印前面部分空白while (j <= 2 * h - 1 - index) {str[index][j] = ' ';j++;}//保持第一行居中if (index == 0) {for (int m = 0; m < h - 2; m++) {str[index][j++] = ' ';}}for (int k = 0; k < list.size(); k++) {//如果是一层最后一个节点if (k == list.size() - 1) {str[index][j++] = list[k];}else {//相邻左右子节点if (k % 2 == 0) {str[index][j++] = list[k];for (int l = 0; l < 3 + 2 * (h - index / 2 - 1); l++) {str[index][j++] = ' ';}}else {str[index][j++] = list[k];str[index][j++] = ' ';}}}index += 2;//cout << endl;}for (int i = 0; i < 10; i++) {if (i % 2 == 1) {for (int j = 0; j < 100; j++) {str[i][j] = ' ';}}}for (int i = 0; i < 10; i++) {if (i % 2 == 0) {for (int j = 0; j < 100; j++) {if (str[i][j] - '0' >= 0 && str[i][j] - '0' <= 9 && i < 2 * h - 2) {str[i + 1][j - 1] = '/';str[i + 1][j + 1] = '\\';}}}}for (int i = 0; i < 10; i++) {for (int j = 0; j < 100; j++) {cout << str[i][j];}cout << endl;}}void DeepFirstSearch(node* root) {if (root == NULL) {return;}else {cout << root->info << ' ';DeepFirstSearch(root->left);DeepFirstSearch(root->right);}}void BreadthFirstSearch(node* root) {queue<node> myTree;if (root != nullptr) {myTree.push(*root);}while (!myTree.empty()) {cout << myTree.front().info << ' ';if (myTree.front().left != nullptr) {myTree.push(*(myTree.front().left));}if (myTree.front().right != nullptr) {myTree.push(*(myTree.front().right));}myTree.pop();}}//用于BFS递归的主函数void BFS_Recursion(node* root, int level, vector<vector<char>>& res) {if (root == nullptr) {return;}if (res.size() < level) {res.push_back(vector<char>());}res[level - 1].push_back(root->info);BFS_Recursion(root->left, level + 1, res);BFS_Recursion(root->right, level + 1, res);}void BreadthFirstSearch_recursion(node* root) {vector<vector<char>> res;BFS_Recursion(root, 1, res);for (int i = 0; i < res.size(); i++) {for (int j = 0; j < res[i].size(); j++) {cout << res[i][j] << " ";}}}//验证是否为二叉搜索树void isBST(node* root) {//先创建一个数组vector<char> midOrderArr;midOrder(root, midOrderArr);//输出看一下我的数组里面存的是不是中序遍历的值for (int i = 0; i < midOrderArr.size(); i++) {cout << midOrderArr[i] << ' ';}cout << endl;for (int i = 0; i < midOrderArr.size()-1; i++) {if (midOrderArr[i] >= midOrderArr[i + 1]) {cout << "该二叉树 不是一颗二叉搜索树!" << endl;return;}}cout << "该二叉树 是一颗二叉搜索树!" << endl;}//二叉树的中序遍历void midOrder(node* root,vector<char>& Arr) {if (root == nullptr) {return;}midOrder(root->left, Arr);Arr.push_back(root->info);midOrder(root->right, Arr);}bool isBST_Recursion(node* root,long long min,long long max) {if (root == nullptr) {return true;}if (root->info <= min || root->info >=max) {//cout << "该二叉树不是一个二叉搜索树";return false;}return isBST_Recursion(root->left, min, root->info) && isBST_Recursion(root->right, root->info, max);}};int main() {binaryTree T;node* root = T.getRoot();T.createTree(root);cout << "树的深度:" << T.depth(root) << endl;T.print(root);cout << "\n===========mid-order recursion===================="<<endl;T.isBST(root);cout << "\n===========upper and lower bounds recursion====================" << endl;if (T.isBST_Recursion(root, LONG_MIN, LONG_MAX)) {cout << "这是一颗二叉搜索树" << endl;}else {cout << "这不是一颗二叉搜索树" << endl;}/*cout << "\n===========DFS recursion====================" << endl;T.DeepFirstSearch(root);cout << "\n===========BFS QUEUE====================" << endl;T.BreadthFirstSearch(root);cout << "\n===========BFS recursion====================" << endl;T.BreadthFirstSearch_recursion(root);*/return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB实现果蝇算法优化BP神经网络预测分类(FOA-BP)

果蝇算法&#xff08;Fruit Fly Optimization Algorithm, FFOA&#xff09;是一种启发式优化算法&#xff0c;受果蝇觅食行为的启发。将其应用于优化BP神经网络&#xff0c;主要是为了寻找BP神经网络中的最佳权重和偏置值。以下是一个基本的流程&#xff1a; 初始化&#xff1a…

上班族小张的副业之路:下班后的水牛社赚钱故事

在快节奏的都市生活中&#xff0c;上班族小张每天忙碌于办公室与家庭之间&#xff0c;重复着朝九晚五的生活。然而&#xff0c;他内心总渴望寻找一种既能充实生活&#xff0c;又能增加收入的副业方式。直到有一天&#xff0c;他发现了水牛社——一个为他提供丰富副业资源和机会…

信息时代的智慧导航:高效搜索、信息筛选与信任构建的全面指南!

文章目录 一、高效搜索&#xff1a;快速定位目标信息的秘诀二、信息筛选&#xff1a;去伪存真&#xff0c;找到有价值的信息三、信任构建&#xff1a;深入了解与直接沟通《搜索之道&#xff1a;信息素养与终身学习的新引擎》亮点内容简介目录获取方式 随着科技的飞速发展&#…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后&#xff0c;发现是出现汉化不完全或者部分汉化的情况&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析&#xff1a;安…

网上招聘系统的设计与实现参考论文(论文 + 源码)

【免费】网上招聘系统的设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89251636 网上招聘系统的设计与实现 摘 要 随着时代的发展&#xff0c;中国的互联网技术愈加成熟&#xff0c;已经有越来越多的社会群体开始学会使用互联网技术&#xff0c;整个…

STM32定时器的OC比较和PWM

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 输出比较(OC) 2. PWM 3. PWM的输出 3.1 高级定时器 3.2 通用定时器 4. PWM的输出结构 5. 代码示例 5.1 PWM.c 5.2 PWM.h 5.3 main.c 这篇文章解释了TIM定时器的内部时钟和外部时钟的使用&a…

头歌:Spark的安装与使用

第1关&#xff1a;Scala语言开发环境的部署 相关知识 Scala是一种函数式面向对象语言&#xff0c;它融汇了许多前所未有的特性&#xff0c;而同时又运行于JVM之上。随着开发者对Scala的兴趣日增&#xff0c;以及越来越多的工具支持&#xff0c;无疑Scala语言将成为你手上一件…

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic

题目&#xff1a;在线学习与推荐系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生&#xff0…

牛客热题:链表中环的入口结点

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;**链表中环的入口结点**题目链接…

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

Flutter 弃用 WillPopScope 使用 PopScope 替代方法

Flutter 弃用 WillPopScope 使用 PopScope 替代方法 视频 https://youtu.be/u3qdqUvFWiM https://www.bilibili.com/video/BV1aJ4m1n7FZ 前言 原文 https://ducafecat.com/blog/migrating-from-willpopscope-to-popscope-in-flutter 了解如何在 Flutter 3.16 中将弃用的 Wil…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测(Matlab)

SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 SCI一区 | MFO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现MFO-CNN…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4--汇编LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…

【云原生】Docker 实践(一):在 Docker 中部署第一个应用

Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用 1.使用 YUM 方式安装 Docker2.验证 Docker 环境3.在 Docker 中部署第一个应用3.1 小插曲&#xff1a;docker pull 报 missing signature key 错误3.2 重新安装 Nginx 1.使用 YUM 方式安装 Docker…