数据结构-数型查找

二叉排序树(BST)

二叉排序树,又称二叉查找树(BST,Binary Search Tree)
一颗二叉树或者是空二叉树,或者是具有如下性质的二叉树:
左子树上所有结点的关键字均小于根结点的关键字;
右子树上所有结点的关键字均大于根结点的关键字;
左子树和右子树又各是一颗二叉排序树

左子树结点值<根结点值<右子树结点值
进行中序遍历,可以得到一个递增的有序序列
二叉排序树的查找

BSTNode *BST_Search(BSTree T,int key){
	while(T!=NULL&&key!=T->key){	//若树空或等于根结点值,则结束循环
        if(key<T->key) T=T->lchild;	//小于,则在左子树上查找
        else T=T->rchild;		//大于,则在右子树上查找
    }
    return T;
}
//在二叉排序树中查找值为key的结点(递归实现)
BSTNode *BSTSearch(BSTree T,int key){
	if(T==NULL)
        return NULL;//查找失败
    if(key==T->key)
        return T;//查找成功
    else if(key<T->key)
        return BSTSearch(T->lchild,key);//在左子树中找
    else
        return BSTSearch(T->rchild,key);//在右子树中找
}

二叉排序树的插入
若原二叉排序树为空,则直接插入结点;否则,若关键字k小于根结点值,则插入到左子树,若关键字k大于根结点值,则插入到右子树

//在二叉排序树插入关键字为k的新结点(递归实现)
int BST_Insert(BSTree &T,int k){
	if(T==NULL){	//原树为空,新插入的结点为根结点
        T=(BSTree)malloc(sizeof(BSTNode));
        T->key=k;
        T->lchild=T->rchild=NULL;
        retunr 1;	//返回1,插入成功
    }
    else if(k==T->key)	//树中存在相同关键字的结点,插入失败
        return 0;
    else if(k<T->key)	//插入到T的左子树
        return BST_Insert(T->lchild,k);
    else 				//插入到T的右子树
        return BST_Insert(T->rchild,k);
}

二叉排序树的删除
先搜索找到目标结点:
1、若被删除结点z是叶结点,则直接删除,不会破坏二叉排序树的性质。
2、若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z的位置。
3、若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。
z的后继:z的右子树中最左下结点(该节点一定没有左子树)
z的前驱:z的左子树中最右下结点(该节点一定没有右子树)
查找效率分析
查找长度–在查找运算中,需要对比关键字的次数称为查找长度,反映了查找操作时间复杂度
image.png
image.png

平衡二叉树

平衡二叉树(Balanced Binary Tree),简称平衡树(AVL树)–树上任一结点的左子树和右子树的高度之差不超过1。
结点的平衡因子=左子树高-右子树高
平衡二叉树的插入
每次调整的对象都是“最小不平衡子树”
调制最小不平衡子树
LL在A的左孩子的左子树中插入导致不平衡
RR在A的右孩子的右子树中插入导致不平衡
LR在A的左孩子的右子树中插入导致不平衡
RL在A的右孩子的左子树中插入导致不平衡
调整最小不平衡子树(LL)
image.png

  1. LL平衡旋转(右单旋转)。由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。将A的左孩子B向右上旋转代替A成为根结点,将A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树。
    调整最小不平衡子树(RR)
    image.png
    2)RR平衡旋转(左单旋转)。由于在结点A的右孩子®的右子树®上插入了新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。将A的右孩子B向左上旋转代替A成为根结点,将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树
    代码思路
    image.png
    实现f向右下旋转,p向右上旋转:
    其中f是爹,p为左孩子,gf为f他爹
    1:f->lchild=p->rchild;
    2:p->rchild=f;
    3:gf->lchild/rchild=p;
    image.png
    实现f向左下旋转,p向左上旋转:
    其中f是爹,p为右孩子,gf为f他爹
    1:f->rchild=p->lchild;
    2:p->lchild=f;
    3:gf->lchild/rchild=p;
    调整最小不平衡子树(LR)
    image.png
    3)LR平衡旋转(先左后右双旋转)。由于在A的左孩子(L)的右子树®上插入新结点,A的平衡因子由1增至2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先左旋转后右旋转。先将A结点的左孩子B的右子树的根结点c向左上旋转提升到B结点的位置,然后再把该c结点向右上旋转提升到A结点的位置
    image.png
    调整最小不平衡子树(RL)
    image.png
    4)RL平衡旋转(先右后左双旋转)。由于在A的右孩子(R)的左子树(L)上插入新结点,A的平衡因子由-1减至-2,导致以A为根的子树失去平衡,需要进行两次旋转操作,先右旋转后左旋转。先将A结点的右孩子B的左子树的根结点C向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升到A结点的位置
    image.png
    image.png

image.png
查找效率分析
若树高为h,则最坏情况下,查找一个关键字最多需要对比h次,即查找操作的时间复杂度不可能超过O(h)
image.png

红黑树

为什么发明红黑树?
平衡二叉树AVL:插入\删除 很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子数(时间开销大),再进行LL\RR\LR\RL调整
红黑树:插入\删除 很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即使需要调整,一般都可以在常数级时间内完成

平衡二叉树:适用于以查为主、很少插入\删除的场景
红黑树:适用于频繁插入、删除的场景,实用性更强

红黑树的定义

红黑树是二叉排序树->左子树结点值<=根结点值<=右子树结点值
与普通BST相比:
1、每个结点或是红色,或是黑色的
2、根节点是黑色的
3、叶结点(外部结点、NULL结点、失败结点)均是黑色的
4、不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)
5、对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同

struct RBnode{		//红黑树的结点定义
	int key;		//关键字的值
    RBnode* parent;	//父节点指针
    RBnode* lChild;	//左孩子指针
    RBnode* rChild;	//右孩子指针
    int color;		//结点颜色,如:0/1 表示 黑/红
}

结点的“黑高”
从某结点出发(不含该结点)达到任一空叶结点的路径上黑结点总数
image.png
红黑树性质
1、从根节点到叶结点的最长路径不大于最短路径的2倍
2、有n个内部节点的红黑树高度h<=2log(n+1)
红黑树的查找
image.png

红黑树的插入

从一颗空的红黑树开始,插入:20,10,5,30,40,57,3,2,4,35,25,18,22,23,24,19,18
先查找,确定插入位置(原理同二叉排序树),插入新结点
新结点是根–染为黑色
新结点非根–染为红色

  • 若插入新结点后依然满足红黑树定义,则插入结束
  • 若插入新结点后不满足红黑树定义,需要调整,使其重新满足红黑树定义(看新结点叔叔的颜色)
    • 黑叔:旋转+染色
      • LL型:右单旋,父换爷+染色
      • RR型:左单旋,父换爷+染色
      • LR型:左、右双旋,儿换爷+染色
      • RL型:右、左双旋,儿换爷+染色
    • 红叔:染色+变新
      • 叔父爷染色,爷变为新结点

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

image.png
image.png
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信支付配置完整操作手册

微信支付配置 必须申请开通微信支付 微信支付官方地址&#xff1a;https://pay.weixin.qq.com/index.php/core/home/login?return_url%2F 申请指引&#xff1a;https://pay.weixin.qq.com/index.php/public/bare_applyment/login4bank 百度经验&#xff1a;https://jingyan.b…

什么是智能井盖?万宾科技的智能井盖传感器的效果

近年来为打造智慧城市政府一直在不懈努力。加速城市基础建设是一项重要的举措&#xff0c;它有助于推动城市综合治理城市生命线的建设工程。在改善市民生活质量的过程中&#xff0c;市政部门正积极进行井盖的改进和升级工作&#xff0c;特别是那些看似微不足道的井盖却蕴含着重…

实时数仓-Flink使用总结

阿里云实时计算Flink版是阿里云基于Apache Flink构建的企业级、高性能实时大数据处理系统。具备一站式开发运维管理平台&#xff0c;支持作业开发、数据调试、运行与监控、自动调优、智能诊断等全生命周期能力。本期将对Flink的使用进行总结。 1. Flink产品回顾 阿里云实时计算…

第八章 :如何基于Spring Boot +Mybatis 快速开发 Restful API

第八章 :如何基于Spring Boot +Mybatis 快速开发 Restful API 前言 本章知识重点:主要讲解开发人员如何利用【MybatisPlus+EasyCode插件 】快速开发Restful API ,利用节约的时间学习,养成一种正向循环的技术之道,最后达到终身学习成长! 案例基于SpringBoot 2.3.2.RELEASE…

北斗卫星为油气管道安全保障提供可靠技术支持

北斗卫星为油气管道安全保障提供可靠技术支持 随着现代社会对能源需求的不断增长&#xff0c;油气管道成为了能源输送的重要通道。然而&#xff0c;油气管道的安全风险也日益凸显。为了及时掌握油气管道的运行状态并有效地监测其安全状况&#xff0c;北斗卫星技术为油气管道监测…

企业真正的性能测试,压测-内存泄露案例分析,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、环境配置 1&a…

OCR转换技巧:如何避免图片转Word时出现多余的换行?

在将图片中的文字识别转换为Word文档时&#xff0c;我们很多时候时会遇到识别内容的一个自然段还没结束就换行的问题&#xff0c;这些就是我们常说的多余换行的问题。为什么会产生这个问题呢&#xff1f;主要是由于OCR返回的识别结果是按图片上的文字换行而换行&#xff0c;而不…

VM虚拟机只有一个C盘怎么添加硬盘新分区盘符

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 VM虚拟机中安装Window 系统后&#x…

Docker学习——⑦

文章目录 1、Docker 为什么需要网络管理2、Docker 网络架构简介2.1 CNM2.2 Libnetwork2.3 驱动 3、常见网络类型4、docker 网络管理命令5、网络详解5.2 docker Bridge 网络5.2 docker Host 网络5.3 docker Container 网络5.4 docker none 网络 1、Docker 为什么需要网络管理 容…

北京永达理慈善基金会与望京街道携手,为乡村振兴贡献10万元

东西部协作是推进巩固脱贫攻坚成果同乡村振兴有效衔接的重要手段。北京市朝阳区人民政府望京街道办事处自2021年起与内蒙古自治区通辽市科左后旗散都苏木、查日苏镇开展为期五年的结对帮扶工作&#xff0c;并号召全社会各界企事业单位及爱心人士帮扶助力&#xff0c;奉献爱心。…

新加坡建筑设备公司【Ten-League】申请3230万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于新加坡的重型建筑设备和工程咨询服务公司Ten-League International Holdings Limited&#xff08;简称&#xff1a;Ten-League&#xff09;近期已向美国证券交易委员会&#xff08;SEC&am…

java--String使用时的注意事项

1.String使用时的注意事项 第一点&#xff1a; ①String对象的内容不可改变&#xff0c;被称为不可变字符串对象。(因为字符串是引用类型&#xff0c;每次都是引用一个地址&#xff0c;就相当于你有车&#xff0c;但是你不可能天天把车踹兜里&#xff0c;只能把钥匙踹兜里&am…

【2021集创赛】Risc-v杯三等奖:基于E203 ShuffleNet的图像识别SoC

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;中国科学技术大学 队伍名称&#xff1a;Supernova 总决赛奖项&#xff1a;三等奖 1.项目简介 本设计以E203处理器为核心&#xff0c;添加协处理器、神经网…

孙哥Spring源码第29集

第29集 解析事务属性中的传播属性 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、事务属性有哪些&#xff1f; 1、事务属性2、传播属性3、只读属性 设置事务为只读&#xff0c;提高事务运行的效率 false 4、超时属性 超时属性 通…

HarmonyOS 学习记录

时光荏苒,岁月如梭,韶华不负,未来可期。转眼间已经30岁了&#xff0c;学习的重要性不言而喻&#xff0c;在接下来的日子里记录下自己学习HarmonyOS的过程。增加一下知识储备&#xff0c;防患于未然嘛 不得不说华为的开发文档写的不错&#xff0c;开发工具直接安装后自动配置环境…

广告业展示服务预约小程序的效果如何

虽然不少人不会与广告业直接接触&#xff0c;但各种形式的广告却是充斥在人们生活中&#xff0c;线下的传单展板、线上的视频、音频、图文等都是广告很好的传播通道&#xff0c;同时广告业能扩展的客户属性也非常广&#xff0c;下到超市小摊&#xff0c;上到企业公司都有大小相…

APS、SAP解析BOM批量核对(我的APS项目三)

APS提供了解析BOM接口 SAP从CU50中解析了BOM 博主开发了一个程序&#xff0c;把两边的BOM数据拉到一起来比对&#xff0c;从最初的一个车型&#xff0c;增加到5个车型&#xff0c;最后成型是30个车型&#xff0c;几乎覆盖了F1、F2的全部车型。 并且程序还实现了消息提醒功能&…

制作企业期刊的网站,小白也能做出超吸睛的期刊

制作企业期刊的网站&#xff0c;对于许多企业来说&#xff0c;是一项既重要又具有挑战性的任务。然而&#xff0c;如果你是一位初学者或者是一位小白&#xff0c;也不用过于担心。按照小编说的步骤去做&#xff0c;你也能制作出吸引人的电子期刊 首先&#xff0c;你需要选择一个…

2011年09月29日 Go生态洞察:image/draw包的深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2.4 CE修改器:代码替换功能

代码替换功能&#xff0c;需要使用 Cheat Engine 工具的“代码查找”功能&#xff0c;来查找游戏数据存储在内存中的地址。首先找到当前数值的存储地址&#xff0c;并将其添加到下方地址列表中。然后右键单击该地址&#xff0c;并选择“找出是什么改写了这个地址”&#xff0c;…