二叉排序树

        在说二叉排序树之前先考虑这样一个例子,假设我们的数据集开始只有一个数{62},然后现在需要将88插入数据集,于是数据集成了{62,88},还保持着从小到大有序,再查找有没有58,没有则插入,可此时要想在线性表的顺序存储中有序,就得移动62和88的位置,如图所示,可不可以不移动呢?当然是可以,那就是二叉树结构,当我们用二叉树的方式时,首先将第一个数62定为根结点,88因为比62大,因此让它做62的右子树,58因此62小,所以成为它的左子树,此时58的插入并没有影响到62与88的关系。

也就是说,若我们现在需要对集合{62,88,58,47,35,73,51,99,37,93}做查找,在我们打算创建此集合时就考虑用二叉树结构,而且是排好序的二叉树来创建。以62,58,88这三个数组成的二叉树为基础,将剩下的数进行添加到树中,小于根结点的数作为左子树,大于根结点的树作为右子树,这样就得到了如图所示的二叉树,并且当我们对它进行中序遍历时,就可以得到一个有序的序列{35,37,47,51,58,62,73,88,93,99},所以我们通常称它为二叉排序树二叉排序树(Binary Sort Tree),又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树
1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
3.它的左丶右子树也分别为二叉排序树

二叉排序树的意义构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度,不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉树排序这种非线性的结构,也有利于插入和删除的实现。

二叉排序树节点信息

typedef struct BiTNode
{int data;struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;

二叉排序树查找操作

#if 0
递归查找二叉排序树T中是否存在key
f指向T的双亲,初始调用值为NULL
查找成功则p指向该元素节点,否则p指向查找路径上访问最后一个节点并返回false
#endif
bool SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{if (!T){*p = f;return false;}else if (key == T->data){*p = T;return true;}else if (key < T->data)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);
}

二叉排序树插入操作

bool InsertBST(BiTree* T, int key)
{BiTree p, s;if (!SearchBST(*T, key, NULL, &p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = key;s->lchild = s->rchild = NULL;if (!p)*T = s;			//插入为新根节点else if (key < p->data)p->lchild = s;	//插入为左孩子elsep->rchild = s;	//插入为右孩子return true;}elsereturn false;
}

二叉排序树创建

int i;
int a[10] = { 62,88,58,47,35,73,51,99,37,93 };
BiTree T = NULL;
for (int i = 0; i < 10; ++i)InsertBST(&T, a[i]);

二叉排序树删除操作

  • 删除叶子结点:其他节点结构并未受影响

  • 仅有左或者右子树的结点:也比较好解决,节点删除后将它的左/右子树整个移动到删除结点的位置即可(子承父业)

  • 左右子树都有的结点:(删除47)

低效方式:,可能会增加树的高度

高效方式:找个可以替代47的结点,比如37和48,因为它们是最接近47的俩个数,如果对其进行中序遍历后,得到这俩个数正好是47的前驱和后继,因此比较好的方法是找到需要删除的结点p的直接前驱(或直接后继)s,来替换结点p,然后再删除此结点s

bool Delete(BiTree* p)
{BiTree q, s;if ((*p)->rchild == NULL)	//右子树空则只需要接它的左子树{q = (*p);*p = (*p)->lchild;free(q);}else if ((*p)->rchild == NULL){q = (*p);*p = (*p)->rchild;free(q);}else    //左右子树均不空{q = *p;s = (*p)->lchild;while (s->rchild)		//左子树中查找到右节点尽头(待删节点前驱){q = s;s = s->rchild;}(*p)->data = s->data;if (q != *p)q->rchild = s->lchild;  //重接q的右子树elseq->lchild = s->lchild;  //重接q的左子树(没有右节点,只有左节点的情况,比如左侧没有36、37只有35、29)free(s);}return true;
}bool DeleteBST(BiTree *T, int key)
{if (!*T)return false;else{if (key == (*T)->data)Delete(T);else if (key < (*T)->data)DeleteBST(&(*T)->lchild, key);elseDeleteBST(&(*T)->lchild, key);}
}

总结

二叉排序树是以链接的方式存储,保持了链接存储结构在执行插入、删除操作时不用移动元素的优点,只要找到合适的插入和删除位置后仅需修改链接指针即可,插入删除的时间性能比较好。对于二叉排序树的查找走的就是从根节点到要查找的结点的路径,其比较次数等于给定值的结点在二叉排序树的层数,最少为1次,最多不超过树的深度,也就是说,二叉排序树的查找性能取决于二叉排序树的形状。问题在于二叉排序树的形状不确定。

比如右边的也是一棵二叉排序树,但查找99结点,左图只需要两次比较,右图需要10次比较

我们希望二叉排序树是比较平衡的,即深度与完全二叉树相同,那么查找的时间复杂度为O(logn),近似于折半查找,右图时间复杂度为O(n),事实上左图也不够平衡,明显左重右轻,因此希望对一个集合按二叉排序树查找,最好是把它构建成一棵平衡的二叉排序树。

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

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

相关文章

GitLab 中文版如何禁止从 UI 上下载代码?

本文分享如何通过配置来禁止用户从 GitLab 中文版 UI 界面上下载源代码。 GitLab 中文版也就是极狐GitLab&#xff0c;使用界面和 GitLab 一样。常规下载代码的方式也一样&#xff0c;要么使用 SSH 或者 HTTP 克隆&#xff0c;要么直接从 UI 上下载源代码&#xff1a; 但是有些…

Conmi的正确答案——ESP32导出烧录进芯片的固件

版本&#xff1a;ESP-IDF 4.4.7 系统&#xff1a;Windows 11 相关链接&#xff1a; 官网&#xff1a;Read Flash Contents: read_flash GITHUB独立工具&#xff1a;esptool 命令&#xff1a; # 我这里用的是C3和windows版的EXE工具 esptool.exe --chip ESP32-C3 -p COM17 -b …

vue2+ element ui 集成pdfjs-dist

目录 1. 下载Pdf.js1.1 下载1.2 修改配置1.2.1 将pdfjs-3.8.162-dist复制到项目中1.2.2 解决跨域问题1.2.3 将pdf.worker.js文件复制到public目录下1.2.4 安装 pdfjs-dist1.2.5 前端vue代码(示例) 3. 参考资料 1. 下载Pdf.js 1.1 下载 下载链接&#xff08;官方&#xff09;需…

为什么越来越多的跨境卖家放弃电商平台,转向独立站?

对于做跨境电商的卖家来说&#xff0c;采用多平台、多站点的经营策略非常重要。这样做不仅可以分散风险&#xff0c;避免把所有的钱都押在一个市场上&#xff0c;减少“把所有鸡蛋放在一个篮子里”的风险&#xff0c;还能拓宽销售渠道&#xff0c;帮助卖家赚更多的钱&#xff0…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

2024年第四届数字化社会与智能系统国际学术会议(DSInS 2024)

会议地点 悉尼会场&#xff1a;澳大利亚悉尼-悉尼科技大学空中科技大学功能中心&#xff0c;沃特尔&#xff08;Aerial UTS Function Centre, Wattle Room&#xff09; 具体地址&#xff1a;Building 10, Level 7, 235 Jones Street, Ultimo, New South Wales, 2007, AU 郑州…

从零开始快速构建Vue3项目

一、技术选型 组件大类 具体插件 vue3插件 相关插件开发文档 基础架构搭建 初始项目搭建、打包构件工具&#xff1a;vite开始 | Vite路由管理及菜单权限封装vue-router介绍 | Vue Router状态管理Pinia介绍 | Pinia 中文文档API请求及异常封装axiosUI框架 element-uihttps…

spring cloud 入门笔记1(RestTemplate,Consul)

最大感受&#xff1a; spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot&#xff0c;各个模块之间&#xff0c;不再是通过导包什么的&#xff0c;调用而是通过网路进行各个模块之间的调用 工具一&#xff1a;RestTemplate 在Java代码中发送HTTP请…

从虚构到现实!FAME助力模型编辑走向实际应用

论文&#xff1a;FAME: Towards Factual Multi-Task Model Editing 链接&#xff1a;https://arxiv.org/abs/2410.10859项目&#xff1a;https://github.com/BITHLP/FAME 前言 大语言模型中丰富的知识使得其在如智能助理&#xff0c;法律顾问&#xff0c;医疗咨询等多个领域中…

无需Photoshop即可在线裁剪和调整图像大小的工具

Bitmind是一个灵活且易于使用的批量图像本地化处理器&#xff0c;经过抓包看&#xff0c;这个工具在浏览器本地运行&#xff0c;不会上传图片到服务器&#xff0c;所以安全性完全有保证。 它可以将图像调整到任何特定尺寸&#xff0c;并在必要时按比例裁剪。 这是一个在线工具…

计算两个结构的乘法

在行列可自由变换的平面上&#xff0c;2点结构有3个 3点结构有6个 计算2*2 2a1*2a14a6 2a1*2a24a8 2a1*2a34a12 显然2a1*2a14a6因为这3个结构都分布在同一列上&#xff0c;就是整数乘法。2a1*2a2的结果有2种写法&#xff0c;一种外形像2a1细节为2a2&#xff0c;一种外形为2…

短剧项目全流程花费项目详解:从软件采购到OSS流量

一、引言 随着网络视频的兴起&#xff0c;短剧项目作为一种新兴的内容形式&#xff0c;受到了广泛关注。然而&#xff0c;短剧项目运营过程中涉及诸多费用&#xff0c;本文将对短剧项目的各项花费进行明细分析&#xff0c;以帮助相关从业者更好地规划预算和控制成本。 二、软…

Vector Optimization – Vector Mask Register

文章目录 Vector优化 – Vector掩码寄存器 Vector优化 – Vector掩码寄存器 One of the reasons for low levels of vectorization is the presence of conditionals (IF statements) inside loops. IF statements introduce control dependencies into a loop. 矢量化水平低的…

冗余连接2 hard题 代随C#写法

此题在卡码网109与力扣685题亦有记载 有一说一C#写法我没咋搞懂 就看明白了思路 这里贴一个答案待后续我醒悟了再来看罢 难就难在对整体数据结构classUnion&#xff08;并查集&#xff09;的理解不熟并且 对于输入输出这个迭代过程理解上也比较吃力 109. 冗余连接II 题…

MySQL:CRUD

MySQL表的增删改查&#xff08;操作的是表中的记录&#xff09; CRUD(增删改查) C-Create新增R-Retrieve检查&#xff0c;查询U-Update更新D-Delete删除 新增&#xff08;Create&#xff09; 语法&#xff1a; 单行数据全列插入 insert into 表名[字段一&#xff0c;字段…

【stable diffusion部署】手把手教你从0基础入门Stable Diffusion

前言 在开始学之前&#xff0c;我想提前说一下&#xff0c;我所理解的AI绘画的本质&#xff0c;就是手替&#xff0c;人提出方案&#xff0c;AI帮你完成具体的作画过程。 写这篇文章的初衷&#xff0c;网上的Stable Diffusion教程太多了&#xff0c;但是我真正去学的时候发现…

前端单元测试框架 引入说明

1. 背景&#xff1a; 2. 如何选择&#xff1a; 2.1. 流行框架 Jest&#xff1a;由Facebook开源的JavaScript测试框架&#xff0c;应用于脸书系以及 ReactJs 系Mocha&#xff1a;适用于 NodeJs 和 浏览器、简易、灵活、有趣的JavaScript 测试框架Jasmine&#xff1a;BDD&#…

有效提升网站流量的SEO技巧分享

内容概要 在数字时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为提升网站曝光度和吸引访问者的重要工具。SEO的核心目标是通过优化网站的各个方面&#xff0c;提高在搜索引擎结果页面上的排名&#xff0c;从而获得更多的自然流量。有效的SEO策略能够让您在激…

MacBook不额外安装软件,怎样投屏到安卓手机上?

提起iPhone或MacBook的投屏&#xff0c;人们总会想到airplay功能。但离开了苹果生态&#xff0c;其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上&#xff0c;到底要怎样做&#xff1f;需要安装什么软件吗&#xff1f; 不需要…

自定义面板,高效的游戏性能分析利器

为了更有效地聚焦并解决性能问题&#xff0c;UWA报告采用了分模块监控策略&#xff0c;确保每个模块独立成章&#xff0c;各司其职。然而&#xff0c;随着对性能分析需求的不断升级&#xff0c;我们已经意识到&#xff0c;在深入分析某些跨模块的性能瓶颈或优化点时&#xff0c…