数据结构-查找-树形结构(二叉排序树、二叉平衡树、红黑树、B树、B+树)查找

news2025/1/22 18:30:11

目录

一、二叉排序树(BST)

查询 

插入

构造二叉排序树

*删除

 *查找效率分析

 二、二叉平衡树

  *插入数据保持平衡

 LL

​编辑

 RR

 LR

RL

 结

  *查找效率分析

 删除

三、红黑树

*插入

*删除 

四、B树 

*插入

*删除

五、B+树


一、二叉排序树(BST)

定义:二叉排序树(也称二叉查找树)或者是一颗空树,或者是具有下列特性的二叉树:

1)若左子树非空,则左子树上所有结点的值均小于根的值

2)若右子树非空,则左右子树上所有结点的值均小于根的值

3)左右子树也分别是一颗二叉排序树

左子树值<根结点值<右子树值

type struct BSTNode{
    int key;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

查询 

非递归方法

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;
}

递归方法实现

BSTNode *BSTSearch(BSTree T,int key){
    if(T==NULL)    return NULL;
    if(key == T->key)  
        return T;
    else if(key<T->key)
        BSTSearch(T->lchild,key);
    else
        BSTSearch(T->rchild,key);
}

插入

int BST_Insert(BSTree &T,int k){
    if(T==NULL){
        T=(BSTree)malloc(sizeof(NSTNode));
        T->key=k;
        T->lchild=T->rchild=NULL;
        return 1;                    //返回1,插入成功
    }else if(k==T->key){
        return 0;                    //返回0,已有,插入失败
    }else if(k<T->key)
        return BST_Insert(T->lchild);    //插入到T的左子树
    else
        retunr BST_Insert(T->rchild);    //插入到T的右子树
}

构造二叉排序树

不同的关系中序列顺序可能的到不同二叉排序树

void Creat_BST(BSTree &T,int str[],int n){
    T=NULL;
    int i=0;
    while(i<n){
        BST_Insert(T,str[i]);
        i++;
    }
}

*删除

①若被删除的z结点是叶结点,则直接删除,不会破坏二叉排序树的性质

②若z结点只有一颗左子树或者右子树,则让z的子树成为z的父结点的子树,替代z的位置

③若结点z有左右两课子树,则令z的直接后继(或者直接前驱)代替z,然后从二叉排序树中删除这个直接后继(或者直接前驱),这样就转换成了第一或第二情况        

 *查找效率分析

查找成功:

        成功=(第几层*每层成功结点树)累和/总成功结点数

        \tiny ASL=(1*1+2*2+3*4+4*4)/11=3(折半查找一样计算)

查找失败:

        失败=(失败的层*每层数量)累和/总失败结点数(折半查找一样计算)

        \tiny ASL=(3*4+4*8)/12=11/3

 二、二叉平衡树

定义:二叉平衡树,简称平衡树(AVL树)  ,树上任意一结点的左子树和右子树的高度之差不超过1

结点的平衡因子=左子树高-右子树高

typedef struct AVLNode{
    int key;                          //数据域
    int balance;                      //平衡因子
    struct AVLNode *lchild,*rchild;
}AVLNode,*AVLTree;

  *插入数据保持平衡

 

 LL

右单旋转:A的左孩子B向右上旋转代替A位置,将A右旋转成B的右孩子,而B原本的右孩子成A的左孩子

 RR

右单旋转:A的右孩子B向左上旋转代替A位置,将A左旋转成B的左孩子,而B原本的左孩子成A的右孩子  

 LR

先左后右双旋转:先将A结点孩子左孩子B的右孩子C向左上旋转提升到B的位置,然后在把C向右上旋转提升的A的位置

RL

先右后左双旋转:先将A结点孩子右孩子B的左孩子C向右上旋转提升到B的位置,然后在把C向左上旋转提升的A的位置

 结

  *查找效率分析

假设以\tiny n_h表示深度为h的平衡树中含有的最少结点数

\tiny n_0=0,n_1=1,n_2=2,并且有\tiny n_h=n_{h-1}+n_{h-2}+1

依此类推\tiny n_3=4,n_4=7,n_5=12......\tiny n=9的高度\tiny h_{max}=4

最大深度为\tiny O(log_2n),平衡二叉树的平均查找长度为\tiny O(log_2n)

 文献

 删除

二叉排序数删除一样找值替代删除的,然后旋转解决不平衡

旋转LL,RR,LR,RL操作上面一样

三、红黑树

是二叉排序树--->左子树结点\tiny \leq根结点\tiny \leq右子树结点

性质①:每个结点孩红色或黑色

        ②:根结点是黑色

        ③:叶结点(虚构的外部结点、NULL结点)都是黑色

        ④:不存在2个相邻的红结点

        ⑤:每个结点,从该结点到任意一叶结点的简单路径上,所包含黑结点相同

性质①:从根结点到叶结点的最长不大于最短路径的2倍

性质②:有n个内部结点的红黑树高度\tiny h<2log_2(n+1)

*插入

左根右,根叶黑

不红红,黑路同

 

*删除 

参考二叉排序树怎么删除的,然后破坏了红黑树性质,在根据插入那一套搞红黑树

四、B树 

m叉树,任何结点至少\tiny \left \lceil m/2 \right \rceil个分叉。即至少含有\tiny \left \lceil m/2 \right \rceil -1个关键字

m叉树平衡树,所有子树高度相同,就是B树

若含n个关键字的m阶B树,最小高度,最大高度多少

每个最多结点(m-1)个关键字,第一层1给结点,第二层m个节点,第三层\tiny m^2个.....第n层\tiny m^{n-1}

所以最小高度 \tiny n\leqslant (m-1)(1+m+m^2+...+m^{n-1})=m^h-1,因此\tiny h\geq log_m(n+1)


最大高度第一层1,第二层2,第三层 \tiny 2\left \lceil m/2 \right \rceil ...第h层\tiny 2(\left \lceil m/2 \right \rceil)^{h-2},第h+1层叶子节点,\tiny 2(\left \lceil m/2 \right \rceil)^{h-1}个,所以n个关键字的B树比有n+1个叶节点,\tiny n+1\geqslant 2(\left \lceil m/2 \right \rceil)^{h-2}\tiny h\leq log_{\left \lceil m/2 \right \rceil}\frac{n+1}{2}+1

*插入

中间往上提

*删除

非终端节点,直接前驱或者直接后继替换

终端节点:①兄弟够借(父拉下一个,兄弟上提一个)

                  ②兄弟不够借(兄弟和上面一个合并)

五、B+树

 ①:每个分支节点最多有m课子树

②:非叶根节点至多有两课子树,其他每个分支节点至少有\tiny \left \lceil m/2 \right \rceil课子树

 

 

 

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

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

相关文章

python的opencv操作记录(13)-增强之直方图均衡化

文章目录 直方图增强基本逻辑-均衡化calcHist && equalizeHistcalcHistequalizeHist 自适应直方图均衡化 前段时间忙活深度网络和android的东西去了&#xff0c;好久没讲讲传统图像处理了&#xff0c;这一篇继续来说说opencv中的传统图像处理部分——图像增强之直方图增…

【谷粒商城之订单服务-RabbitMQ延时队列】

本笔记内容为尚硅谷谷粒商城订单服务锁库存事务最终一致性部分 目录 一、RabbitMQ延时队列 二、具体实现 1、 创建上述队列和路由组件 2、解锁库存 解锁库存的两种情况 1、当订单业务提交后回滚 2、订单取消解锁库存 三、关闭订单 四、消息丢失、挤压、重复等解决方案…

c++ 继承与派生

继承就是在原有类的基础上产生新类&#xff0c;从而减少了代码重复的必要 格式&#xff1a; class A{}; class B:继承方式 A{}; 在c继承中&#xff0c;有以下几点注意 (1)基类的构造函数与析构函数不能被继承 (2)派生类对基类成员的继承没有选择权&#xff0c;不能选择继承…

c++ 常用总结(三)

1.设计模式 GitHub - FengJungle/DesignPattern: Design pattern demo code &#xff08;一&#xff09; ① 简单工厂模式 再不学简单工厂模式&#xff0c;就真的要去工厂搬砖啦~_冯Jungle的博客-CSDN博客 通过以下的例子可见&#xff0c;只需要提供产品名称作为参数&…

基于springboot+mysql+SpringDataJPA +html实现学生选课管理系统

基于springbootmysqlSpringDataJPA html实现学生选课管理系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a;4.项目需求 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 管理员&#xf…

【C++】| 03——STL | 迭代器

系列文章目录 【C】| 01——泛型编程 | 模板 【C】| 02——STL | 初识 【C】| 03——STL | 迭代器 【C】| 04——STL | 容器_vector 文章目录 1. 什么是迭代器2. 迭代器的分类3. 不同容器对应的迭代器4. 迭代器的好处5. 迭代器的操作 1. 什么是迭代器 迭代器就是指向容器内元素…

基于MATLAB的路面裂缝检测识别算法代码(GUI系统设计+图像预处理+裂缝检测)

资源地址&#xff1a; 基于MATLAB的路面裂缝检测识别算法代码&#xff08;GUI系统设计图像预处理裂缝检测&#xff09;资源-CSDN文库 主要内容&#xff1a; 1、运行Gui_Main.m程序&#xff0c;得到GUI界面 2、首先点击载入图像文件 3、后续便可以点击右侧的其他按钮进行分析…

C++linux高并发服务器项目实践 day10

Clinux高并发服务器项目实践 day10 守护进程进程组会话进程组、会话操作函数守护进程守护进程的创建步骤 线程线程和进程的区别线程之间共享和非共享资源线程操作线程创建线程退出线程参与线程分离线程取消 线程属性 守护进程 在UNIX系统中&#xff0c;用户通过终端登录系统后…

DCMM评估之战略维度沟通

01 数据战略规划过程 过程描述&#xff1a; 过程描述如下:a) 识别利益相关者,明确利益相关者的需求;b) 数据战略需求评估,组织对业务和信息化现状进行评估,了解业务和信息化对数据的需求;c) 数据战略制定,包含但不限于:1) 愿景陈述,其中包含数据管理原则、目的和目标;2) 规划…

SpringCloud 远程调用Feign、网关Gateway、配置中心Nacos、微服务架构小结、Nacos搭建集群

统一检查maven maven依赖出错的解决 注意代码格式化。因代码格式混乱&#xff0c;导致代码出错&#xff0c;pom.xml出现重复的parent标签 学习方法&#xff0c;听得懂为什么要这么做&#xff0c;要远远比 怎么做 重要的多 一、远程调用Feign 能够使用Feign进行远程调用能够…

【C++学习】创建二维动态数组

1.指针 创建二维动态数组_牛客题霸_牛客网 (nowcoder.com) 使用指针的指针 使用指针的指针可以很方便地创建动态的二维数组&#xff0c;其关键在于使用两层指针进行分配。 以下是一个动态创建n行m列的二维数组的示例代码&#xff1a; int **arr new int*[n]; // 创建一个…

深度学习训练营J2:ResNet50v2算法分析与实战

深度学习训练营J2:ResNet50v2算法分析与实战 原文链接环境介绍0.引言论文分析与解读1.ResNet50和ResNet50v2之间的结构对比2.不同结构之间的尝试 3.关于激活的不同尝试4.文章结果 ResNet50v2架构复现5.残差结构6.模块构建7.架构展示以及网络构建 8.网络结构打印ResNet50v2完整结…

Python——1

一、注释 &#xff08;1&#xff09;单行注释&#xff1a;#需要注释的内容&#xff08;#&#xff09; &#xff08;2&#xff09;多行注释&#xff1a;需要注释的内容&#xff08;三引号&#xff09; 二、变量及变量类型 1.变量 语法定义&#xff1a;变量名 变量值&#…

【小程序】微信云托管服务

链接 官方文档 云托管官网 特点 无需自提供服务&#xff0c;有云托管平台自动分配&#xff0c;并自动缩容/扩容支持多种语言及模板实例采用容器化管理方式实现服务部署支持小程序内网访问&#xff0c;仅公网测试&#xff0c;提供足够的安全防护&#xff0c;微信用户就近接入…

Python:BeautifulSoup库介绍

BeautifulSoup库介绍 1、BeautifulSoup是Python中的一个第三方库&#xff0c;其最主要的功能是处理HTML文档 ⑴查找HTML文档中的指定标签 ⑵获取HTML文档中指定标签的标签名、标签值、标签属性等 ⑶修改HTML文档中指定标签 2、BeautifulSoup库将HTML文档解析为一…

服务器如何做端口映射,使服务器之间通信,然后访问目标网站(baidu.com)

文章目录 服务器如何做端口映射&#xff0c;使服务器之间通信&#xff0c;然后访问目标网站&#xff08;baidu.com)问题缘由所需环境操作步骤1. 目的服务器设置2. 中间服务器设置3. 修改客户端 总结 服务器如何做端口映射&#xff0c;使服务器之间通信&#xff0c;然后访问目标…

DataX读取Hive Orc格式表丢失数据处理记录

文章目录 问题问题概述问题详细描述 原因解决方法修改源码验证 问题 问题概述 DataX读取Hive Orc存储格式表数据丢失 问题详细描述 同步Hive表将数据发送到Kafka&#xff0c;Hive表A数据总量如下 SQL&#xff1a;select count(1) from A; 数量&#xff1a;19397281使用Dat…

HTML小游戏25 —— HTML5拉杆子过关小游戏(附完整源码)

本节教程我会带大家使用 HTML 、CSS和 JS 来制作一个HTML5拉杆子过关小游戏 ✨ 前言 &#x1f579;️ 本文已收录于&#x1f396;️100个HTML小游戏专栏&#xff1a;100个H5游戏专栏https://blog.csdn.net/qq_53544522/category_12064846.html&#x1f3ae; 目前已有100小游戏…

交叉编译--build、--host、--target、--prefix

一、编译例子 ./configure --build编译平台 --host运行平台 --target目标平台 [各种编译参数]build&#xff1a;表示目前我们正在运行的平台名称是什么&#xff0c;如&#xff1a;当前我们是在电脑上编译该系统&#xff0c;那么我们的 --build 就可能是 x86&#xff0c;如果…

如何避免因为 Kubernetes 和 Kafka 而被解雇

本文由 Bing AI 生成。Bing AI 真是尽显程序员本色&#xff0c;我等它生成文章的过程中发现出现了 Markdown 语法&#xff0c;结果点复制过来的就是直接 Markdown 文档。 Kubernetes 和 Kafka 是两个非常流行的技术&#xff0c;它们分别用于容器编排和分布式消息传递。它们的优…