C++ 二叉搜索树的概念特性

news2025/1/12 10:57:30

1. 二叉搜索树

1.1 二叉搜索树概念

二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 :
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树。

1.2 二叉搜索树操作  

1. 二叉搜索树的查找

a 、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
b 、最多查找高度次,走到到空,还没找到,这个值不存在。

2. 二叉搜索树的插入

插入的具体过程如下:
a. 树为空,则直接新增节点,赋值给 root 指针
b. 树不空,按二叉搜索树性质查找插入位置,插入新节点

3.二叉搜索树的删除

首先查找元素是否在二叉搜索树中,如果不存在,则返回 , 否则要删除的结点可能分下面四种情
况:
a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点
看起来有待删除节点有 4 中情况,实际情况 a 可以与情况 b 或者 c 合并起来,因此真正的删除过程
如下:
情况 b :删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点 -- 直接删除
情况 c :删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点 -- 直接删除
情况 d :在它的右子树中寻找中序下的第一个结点 ( 关键码最小 ) ,用它的值填补到被删除节点
中,再来处理该结点的删除问题 -- 替换法删除。

4 二叉搜索树的应用

1. K 模型: K 模型即只有 key 作为关键码,结构中只需要存储 Key 即可,关键码即为需要搜索到
的值
比如: 给一个单词 word ,判断该单词是否拼写正确 ,具体方式如下:
以词库中所有单词集合中的每个单词作为 key ,构建一棵二叉搜索树
在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。
2. KV 模型:每一个关键码 key ,都有与之对应的值 Value ,即 <Key, Value> 的键值对 。该种方
式在现实生活中非常常见:
比如 英汉词典就是英文与中文的对应关系 ,通过英文可以快速找到与其对应的中文,英
文单词与其对应的中文 <word, chinese> 就构成一种键值对;
再比如 统计单词次数 ,统计成功后,给定单词就可快速找到其出现的次数, 单词与其出
现次数就是 <word, count> 就构成一种键值对

5 二叉搜索树的性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有 n 个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二
叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:
最优情况下,二叉搜索树为完全二叉树 ( 或者接近完全二叉树 ) ,其平均比较次数为: $log_2 N$
最差情况下,二叉搜索树退化为单支树 ( 或者类似单支 ) ,其平均比较次数为: $\frac{N}{2}$
问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插
入关键码,二叉搜索树的性能都能达到最优?那么我们后续章节学习的 AVL 树和红黑树就可以上
场了。

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

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

相关文章

华为云部署JDK环境

一、确定系统内核 在下载jdk之前要先确定自己的内核是什么版本&#xff0c;因为我选的云服务器是CentOS7&#xff0c;所以一定是Linux_86_64版本。 若不确定可以在命令行中输入“uname -a”来查看系统内核。 二、下载JDK 到官网下载对应统信系统版本的jdk安装包 jdk官网&…

Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 线程池及常用的线程池

目录 引出创建多线程的方法Thread类创建多线程Runnable接口创建多线程Thread类的常用方法两者的对比 线程池是啥&#xff1f;为啥用&#xff1f;结合案例理解常用的线程池继承Runnable接口的工人实体类newSingleThreadExecutor&#xff08;单线程&#xff09;newFixedThreadPoo…

Simulink仿真模块 - Clock

Clock&#xff1a;显示并提供仿真时间 库&#xff1a; Simulink / Sources 模型为&#xff1a; 说明 Clock 模块在每个仿真时间步输出当前仿真时间。此模块对需要仿真时间的其他模块非常有用。 当在离散系统中需要当前时间时&#xff0c;请使用Digital Clock模块。 实例 模块…

利用python批量掩膜提取遥感图像

&#xff08;1&#xff09; 前言 遥感影像的提取和分析在地理信息系统、环境监测、农业、城市规划等领域具有重要的应用价值。按掩膜提取遥感影像是一种常用的方法&#xff0c;它可以通过定义掩膜来选择感兴趣的区域&#xff0c;并排除其他干扰因素。 按掩膜提取遥感影像的方…

ssm网上服装销售系统源码和论文

ssm网上服装销售系统047 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 目前互联网上的网上销售系统每天以惊人的速度增加&#xff0c;网上购物越来越成为现代年轻人的首选&#xff0c;足不出门便能选购好自己…

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态

胖小酱之广告

广告是一种宣传手段&#xff0c;通过一定形式的媒体&#xff0c;向公众传递信息的方式。广告可以分为广义和狭义两种&#xff0c;其中广义广告是指不以营利为目的的广告&#xff0c;如政府公告、社会团体声明等&#xff1b;狭义广告则是指以营利为目的的广告&#xff0c;通常是…

【JAVA基础】 IO详解

【JAVA基础】 IO详解 文章目录 【JAVA基础】 IO详解一、概述二、IO流的作用三、IO流的使用场景四、IO流的分类4.1 传输数据的单位分&#xff1a;4.2 数据传输的方向分&#xff1a;4.3 流的角色的不同分&#xff1a; 五、IO流体系六、字节输入流InputStream七、字节输出流 Outpu…

Python 从入门到实践第3版(中文版)正式版+编制版+电子版

Python编程&#xff1a;从入门到实践&#xff08;第3版&#xff09; ([美] 埃里克 • 马瑟斯&#xff08;Eric Matthes&#xff09;) 2023 (Z-Library)

【算法日志】动态规划刷题:01背包问题(day36)

代码随想录刷题60Day 前言 今天主要讨论背包问题中的01背包问题&#xff0c;这类问题的难点在于怎样对问题进行数学建模。一旦思考好问题的解决方式&#xff0c;剩下的步骤就比较简单了。 分割等和子集 本题可采用暴力回溯&#xff0c;但复杂度比较高&#xff0c;所以采取动态…

解决Win10运行软件程序提示【管理员已阻止你运行此应用】

一、问题描述 在Win10系统打开软件&#xff0c;弹窗提示【管理员已阻止你运行此应用】&#xff0c;如下图所示&#xff1a; 二、问题分析 是由于Windows系统的安全策略设置影响&#xff0c;保护你的电脑不被恶意程序破坏&#xff1b;只用修改系统的安全策略即可。 三、解决办法…

多目标优化算法知识点梳理

EA进化算法 MOEA多目标进化算法 1.MOEA的分类 1.1 按不同的进化机制分类 基于分解的MOEA&#xff1a;是比较早起所使用的方法&#xff1a;聚集函数法。将被优化的所有子目标组合或聚集为单个目标&#xff0c;从而将多目标优化问题转换为单目标优化问题。 基于支配关系的MOE…

ACME协议申请泛域名证书

ACME协议申请泛域名证书 注册域名 namecheap迁移DNS到cloudflare创建API令牌 区域选择域名生成证书安装证书参考 注册域名 namecheap 迁移DNS到cloudflare 创建API令牌 区域选择域名 复制此令牌&#xff0c;令牌只显示一次。 生成证书 export CF_Token"API令牌"a…

从零实现深度学习框架——Transformer从菜鸟到高手(二)

引言 &#x1f4a1;本文为&#x1f517;[从零实现深度学习框架]系列文章内部限免文章&#xff0c;更多限免文章见 &#x1f517;专栏目录。 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…

C++信息学奥赛2046:【例5.15】替换字母

这段代码的功能是对输入的字符串进行处理&#xff0c;将字符串中的字符 a 替换为字符 b 后输出结果。 #include<bits/stdc.h> using namespace std; int main() {string s; // 定义字符串变量s&#xff0c;用来存储输入的字符串char a, b; // 定义字符变量a和b&#xff…

港科夜闻|香港科大将与世界经济论坛合作举办大中华区首个全球青年领袖论坛领导力发展课程,与全球青年领袖共同探讨人工智能...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、​香港科大将与世界经济论坛合作举办大中华区首个"全球青年领袖论坛领导力发展课程",与全球青年领袖共同探讨人工智能。香港科大下月将与世界经济论坛合作&#xff0c;接待40位来自包括欧洲、拉丁美洲、非洲和…

采用typescript编写,实现ofd前端预览、验章

前言 浏览器内核已支持pdf文件的渲染&#xff0c;这极大的方便了pdf文件的阅读和推广。ofd文件作为国产板式标准&#xff0c;急需一套在浏览器中渲染方案。 本人研究ofd多年&#xff0c;分别采用qt、c# 开发了ofd阅读器。本人非前端开发人员&#xff0c;对js、typescript并不熟…

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…

京东CEO许冉的第一份成绩单 我们打分:80!

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年8月16日&#xff0c;京东发布了截至2023年6月30日的二季度财报及中期业绩。这也是京东集团CEO许冉由CFO升任CEO后交出的第一份成绩单。 在看成绩单之前&#xff0c;我们先回顾一下许冉上任时京东的状况。当时&#xff0c;…

群晖上用Docker安装OpenWrt

什么是 OpenWrt &#xff1f; OpenWrt 是一款基于 Linux 系统的开源路由器操作系统&#xff0c;可以将普通的 PC 或嵌入式设备转变成为一个功能强大的路由器。 老苏对没玩过的东西总是比较好奇&#xff0c;准备用 Docker 搭建一个 OpenWrt 来研究研究。 网上管这种玩法叫旁路路…