二叉树、红黑树、B树、B+树

二叉树

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。

满二叉树

满二叉树:二叉树的所有叶子节点都在最后一层且总数n=2^(n-1)。

完全二叉树

完全二叉树:数据从上到下,从左到右依次进行平铺。

有序二叉树

有序二叉树:左子树上的值小于根节点的值,右子树上的值大于根节点的值。

有序二叉树的遍历:

深度优先遍历:

1、先序/前序遍历:根节点----》左子树-----》右子树

2、中序遍历:左子树----》根节点-----》右子树

3、后序遍历:左子树----》右子树-----》根节点

有序二叉树不稳定:O(logn) - O(n)

有序二叉树不稳定是因为没有任何限制,以至于在某些特殊的情况下会形成链表。

平衡二叉树

平衡二叉树是在有序二叉树的基础之上而来的,就是为了解决有序二叉树不稳定的问题。要求:一个节点的左右子树高度差的绝对值不能超过1,可以等于1。

如果插入的数据之后使得一个节点的左右子树高度差的绝对值超过了1,就要通过LL、RR、LR、RL四种旋转策略来保证平衡二叉树。

四种旋转策略

LL旋转策略:

实例:

RR旋转策略:

实例:

LR旋转策略:

实例:

RL旋转策略:

实例:

在实行旋转策略是,选择距离造成不平衡节点最近的不平衡节点作为要操作节点。

平衡二叉树特别稳定,但每次进行调整都会耗费计算机性能。

我们想既要时间复杂度在O(logn),又要十分稳定,还要不耗费计算机性能,这时,推出了红黑树。

红黑树(基于2-3-4树)

2-3-4树是从下向上构建的。节点内升序,每个节点最多有3个值,当插入第4个值时,需要在这四个之中选中间值进行升元。

实例:

然后通过2-3-4树转换 形成红黑树

转换规则如下图:

将刚刚的2-3-4树转换为红黑树:

红黑树的特点:

1、红黑树中每一个节点不是红色节点就是黑色节点。

2、红黑树当中根节点一定是黑色的。———>在转化的过程中2-3-4节点都是以黑色节点开头的

3、每一个叶子节点都是黑色的。

4、从根节点到任意一个叶子节点的路径上所走过的黑色节点的数量相同

5、如果一个节点是红色的,那么他的子节点一定是黑色

4、5条特点会导致最长的路径绝对不会超过最短路径的2倍。例如最长路径为黑红黑红黑红,最短路径为黑黑黑。

为什么红黑树是O(logn)?

2-3-4树是多叉树,如果数据相等,它的时间复杂度小于传统二叉树,2-3-4树的时间复杂度

红黑树最复杂的时候也就是变为2倍,变为2logn。这是依旧可以看成是logn。

B树

多叉树以B树为最基本点。2-3-4树来源于B树。

B树特点:

1、B树的数据存储是 key-value类型的。

2、B树有几个叉:并不确定,要看具体实现。

3、M阶B树

        3.1、每个节点上最多有 M-1 个值,并且以升序排列。3阶B树每个节点最多有两个值。.....(2-3-4树属于4阶B树)

红黑树和B树如果都在内存中,内存向cpu提供数据的时间相等,由于红黑树对比次数相对较少,所以红黑树是内存最优二叉树。

为什么要有B树:

红黑树和B树如果都在磁盘中--------》数据寻址浪费时间--------》磁头移动的物理时间+平均盘面旋转半圈

B树多用于磁盘,原因是分出多个叉,降低树的高度,降低寻址次数和时间。

B树优胜于寻址,但是数据进行对比还是要在内存中。

B+树

在B树基础上改造出现的B+树,但和传统B树又不太一样。B+树是mysql数据库专用底层数据结构。

B+树的特点:

1、非叶子节点仅具有索引功能,也就是说非叶子节点只能存储key值,不能存储value值。

2、B+树的所有叶子节点会构成一个有序的链表,这样就可以根据key值遍历数据。

之所以有这两个特点就是为数据库的功能服务

B+树的构建

插入 3 ,4

磁盘向cpu推送数据:每次需要推送一页(4kb)的数据,如两个文件 2kb+3kb,只能先推送2kb,再推送3kb。

B+树的优点:

1、非叶子节点不包含数据,只能放索引,这样每次就可以向内存当中传输更多的key值,在内存当中进行数据比对,在磁盘当中进行数据查询。

2、叶子节点是链接在一起的,这样有利于区间查询。

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

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

相关文章

C++11 Lambda表达式

Lambda表达式简介 Lambda表达式是现代C在C11和更高版本中的一个新的语法糖。它是一种定义匿名函数对象的便捷方法,常用于封装传递给算法或异步方法的几行代码。Lambda表达式可以在调用或作为函数参数传递的位置处定义,可以捕获上下文中的变量供函数使…

目标检测(Object Detection):Fast R-CNN,YOLO v3

目录 目标检测(Object Detection) R-CNN SPPNet Fast R-CNN YOLO v1 YOLO v2 YOLO v3 目标检测(Object Detection) 任务是计算机视觉中非常重要的基础问题,也是解决图像分割、目标跟踪、图像描述等问题的基础。目标检测是检测输入图像是否存在给定类别的物体…

适配器模式实现stack和queue

适配器模式实现stack和queue 什么是适配器模式?STL标准库中stack和queue的底层结构stack的模拟实现queue的模拟实现 什么是适配器模式? 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff…

浅谈泛在电力物联网发展形态与技术挑战

安科瑞 华楠 摘 要:泛在电力物联网是当前智能电网发展的一个方向。首先,总结了泛在电力物联网的主要作用和价值体现;其次,从智能电网各个环节概述了物联网技术在电力领域的已有研究和应用基础;进而,构思并…

OpenAI Function calling

开篇 原文出处 最近 OpenAI 在 6 月 13 号发布了新 feature,主要针对模型进行了优化,提供了 function calling 的功能,该 feature 对于很多集成 OpenAI 的应用来说绝对是一个“神器”。 Prompt 的演进 如果初看 OpenAI 官网对function ca…

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更…

MySQL 日志

目录 一、日志概述 二、二进制日志 1、开启二进制日志 2、查看二进制文件 3、删除二进制日志文件 4、恢复二进制日志 5、暂时停止二进制日志功能 三、错误日志 1、启动和设置错误日志 2、查看错误日志 3、删除错误日志 四、通用查询日志 五、慢查询日志 一、日志概…

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端,实现相关的自定义处理。实现客户服务自动化,对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求,以进一…

红利期已过?2023跨境电商还吃香吗?亚马逊还能做吗?

2022年,由于疫情反复和外部因素的影响,跨境电商的情况并不乐观。但这并不意味着跨境电商已经走到了绝境。随着贸易全球化的深入发展,平台规则不断完善,国家相继出台最新的扶持政策,为跨境电商企业带来了更多的发展机遇…

1.1 VMware Workstation与Kali的安装和配置1

资源见专栏第一篇文章https://blog.csdn.net/algorithmyyds/article/details/132457258 安装VMware 不多加赘述,直接按顺序安装即可。 有以下需注意的地方: 1.建议选择增强型服务; 2.不要加入体验改进计划。是否开启提示更新看你的想法&…

Java数据结构学习和源码阅读(线性数据结构)

线性数据结构 链表 LinkList 链表的数据结构 一组由节点组成的数据结构,每个元素指向下一个元素,是线性序列。 最简单的链表结构: 数据指针(存放执行下一个节点的指针) 不适合的场景: 需要循环遍历将…

JVM及垃圾回收机制

文章目录 1、JVM组成?各部分作用?1.1 类加载器(Class Loaders)1.2 运行时数据区(Runtime Data Area)1.3 执行引擎(Execution Engine)1.4 本地方法接口(Native Interface&…