C++——二叉搜索树

二叉搜索树

二叉搜索树: 又为搜索二叉树,一般具有以下的性质

  • 若它的左子树不为空,则左子树上所有的节点的值都小于父亲节点
  • 若它的右子树不为空,则右子树上所有的节点的值都大于父亲节点
  • 它的左右子树也都为二叉搜索树

在这里插入图片描述

二叉搜索树操作:

以下面图示例子

在这里插入图片描述

int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};

1、二叉搜索树的查找

  • 从根开始比较,查找,比根大就往右子树走,比根小就往左子树走
  • 最多查找树的高度,如果走到空,就说明没有这个值,查找失败
    bool Find(const K& key){Node* cur = _root;if(cur->_key> key){cur = cur->_left;}else if(cur->_key < key){cur = cur->_right;}else {return true;}return false;}

2、二叉搜索树的插入

插入的具体过程如下:

  • 树为空,则直接新增节点,赋值给root指针
  • 树不为空,按二叉搜索树性质查找新增位置,插入新增节点
  • 如果插入的值与它本身的值相等,就失败,二叉搜索树中不能有相同的值
  • 在这里插入图片描述
bool Insert(const K& key){//判断是不是空if(_root == nullptr){_root = new Node(key);return true;}//不是空,就插入Node* cur = _root;Node* parent = nullptr;while(cur){if(cur->_key > key){parent = cur;cur = cur->_left;}else if(cur->_key < key){parent = cur;cur = cur->_right;}else{return false;}}//到这里说明是空cur = new Node(key);//链接if(parent->_key > key)parent->_left = cur;else parent->_right = cur;return true;}

3、二叉搜索树的删除

首先查找元素是否存在二叉搜索树中,如果不存在,则返回,否则要删除的节点要分以下四种情况:

  • 要删除的节点无孩子节点
  • 要删除的节点只有左孩子
  • 要删除的节点只有右孩子
  • 要删除的节点有左右孩子

首先这里可以说是三种情况,因为如果没有孩子节点,那么就会进入到只有左孩子或者只有右孩子的节点的情况。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    bool Erase(const K& key){Node* parent = nullptr;Node* cur = _root;while(cur){if(cur->_key > key){parent = cur;cur = cur->_left;}else if(cur->_key < key){parent = cur;cur = cur->_right;}else{//cur的左为空if(cur->_left == nullptr){if(cur == _root)_root = cur->_right;else{if(cur == parent->_left){parent->_left = cur->_right;}else if(cur == parent->_right){parent->_right = cur->_right;}}delete cur;return true;  }else if(cur->_right == nullptr)// cur->_right为空{if(cur == _root)_root = cur->_right;else {if(cur == parent->_left)parent->_left = cur->_left;else if(cur == parent->_right)parent->_right = cur->_left;}delete cur;return true;}else{//替换法  右数最小节点或者左树最大节点,然后赋值,删除最小/最大节点//如果都不为空Node* rightMinParent = cur; //这里必须赋值为cur,因为如果是头删这里就会有问题Node* rightMin = cur->_right;//找右数中最小的值while(rightMin->_left){rightMinParent = rightMin;rightMin = rightMin->_left;}cur->_key = rightMin->_key;//此时rightMin的左子树为空,右子树可能有值if(rightMin == rightMinParent->_left)rightMinParent->_left = rightMin->_right;else rightMinParent->_right = rightMin->_right;delete rightMin;return true;}}}return false;}

二叉搜索树的性能分析:

二叉搜索树的插入和删除操作都需要查找,所以查找是二查搜索树中的性能关键。

如果有n个节点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树的平均查找长度的关键就在于树的深度。

如果树是一颗二叉平衡搜索二叉树,那么查找的效率就是O(logN)
在这里插入图片描述

当然也有特殊的场景,如下图所示,它的查找效率就会变得非常慢,平均比较次数就达到了O(N^2)
在这里插入图片描述

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

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

相关文章

设计模式六:策略模式

1、策略模式 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使每个算法可以相互替代&#xff0c;使算法本身和使用算法的客户端分割开来&#xff0c;相互独立。 策略模式的角色&#xff1a; 策略接口角色IStrategy&#xff1a;用来约束一系列具体…

基于SpringBoot的航班进出港管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

使用GPT生成python图表

首先&#xff0c;生成一脚本&#xff0c;读取到所需的excel表格 import xlrddata xlrd.open_workbook(xxxx.xls) # 打开xls文件 table data.sheet_by_index(0) # 通过索引获取表格# 初始化奖项字典 awards_dict {"一等奖": 0,"二等奖": 0,"三等…

消息中间件篇之Kafka-高性能设计

一、高性能设计 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据。 顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率。 页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把对磁盘的访问变为对内存的访问。 零拷贝&a…

计算机网络面经-从浏览器地址栏输入 url 到显示主页的过程?

大概的过程比较简单&#xff0c;但是有很多点可以细挖&#xff1a;DNS解析、TCP三次握手、HTTP报文格式、TCP四次挥手等等。 DNS 解析&#xff1a;将域名解析成对应的 IP 地址。TCP连接&#xff1a;与服务器通过三次握手&#xff0c;建立 TCP 连接向服务器发送 HTTP 请求服务器…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

stream流-> 判定 + 过滤 + 收集

List<HotArticleVo> hotArticleVos hotArticleVoList .stream() .filter(x -> x.getChannelId().equals(wmChannel.getId())).collect(Collectors.toList()); 使用Java 8中的Stream API对一个名为hotArticleVoList的列表进行过滤操作&#xff0c;筛选出符合指定条件…

介绍 PIL+IPython.display+mtcnn for 音视频读取、标注

1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数&#xff0c;用于多分类问题中。它的计算方式如下&#xff1a;首先&#xff0c;对于每个样本&#xff0c;我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…

linux前端部署

安装jdk 配置环境变量 刷新配置文件 source profile source /etc/profile tomcat 解压文件 进去文件启动tomcat 开放tomcat的端口号 访问 curl localhsot:8080 改配置文件 改IP,改数据库名字&#xff0c;密码&#xff0c; 安装数据库 将war包拖进去 访问http:…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! 解…

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…

黑色金属冶炼5G智能工厂数字孪生可视化管控系统,推进金属冶炼行业数字化转型

黑色金属冶炼5G智能工厂数字孪生可视化管控系统&#xff0c;推进金属冶炼行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。金属冶炼行业作为传统工业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了推进金属冶炼行…

基于虚拟力优化的无线传感器网络覆盖率matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率&#xff0c;仿真输出优化前后的网络覆盖率&#xff0c;覆盖率优化收敛迭代曲线…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

kafka生产者

1.原理 2.普通异步发送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

【汽车电子】万字详解汽车标定与XCP协议

XCP协议基础 文章目录 XCP协议基础一、引言1.1 什么是标定1.2 什么时候进行标定1.3 标定的意义 二、XCP协议简介2.1 xcp简介2.2 XCP如何加快开发过程&#xff1f;2.3 XCP的主要作用 三、XCP工作过程3.1 工作过程3.2 通讯模型3.3 测量与标定 四、XCP报文解析4.1 数据包报文格式4…

恢复软件哪个好用?记好这3个文件恢复宝藏!

“现在市面上的恢复软件太多啦&#xff01;哪款恢复软件比较好用呢&#xff1f;大家可以给我推荐几个靠谱的恢复软件或者方法吗&#xff1f;感谢&#xff01;” 在日常使用电脑的过程中&#xff0c;文件丢失或删除是一个常见的问题&#xff0c;而恢复软件成为解决这一问题的得力…

Vue:基本命令的使用(代码 + 效果)

文章目录 Hello Vue!el: 挂载点datamethods vue命令v-textv-htmlv-on v-showv-ifv-bindv-forv-model Hello Vue! <!DOCTYPE html> <html><head><title>Hello Vue!</title></head><body><div id"app">{{ message }}…