红黑树和b+树
二叉搜索树
满足以下条件:
- 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。
- 任意节点的左、右子树也是二叉搜索树,即同样满足条件
1.

这是一个正常的,没有碰到极端情况的二叉搜索树。
如果数据是有序的或者在删除,插入操作下,那么可能会退化成一条链。严重影响性能。

平衡二叉搜索树(AVL)
在这种情况下可以通过不同的旋转操作来保证树的平衡。
- “节点高度”是指从该节点到它的最远叶节点的距离,即所经过的“边”的数量。
- 节点的平衡因子(balance factor)定义为节点左子树的高度减去右子树的高度,同时规定空节点的平衡因子为 0 。
- 我们将平衡因子绝对值 >1 的节点称为“失衡节点”
旋转
旋转操作是为了将二叉树重新平衡。
在插入或删除的时候,如果节点失衡,平衡因子的绝对值只能是2。

5 和 7 是失衡节点。它们失衡是因为 1 的存在,从节点 5 到 1 有两条边,这是罪魁祸首,只要把 3 作为 1 ,5 的父节点就好了。

但是为什么不把 5 作为 3 ,7 的父节点呢?找离新插入的节点最近的不平衡的树进行调整
为什么要这么操作呢?
AVL树的平衡性是递归定义的。每个节点的左右子树高度差不能超过1。
如果只调整离新插入节点最近的不平衡节点,可以确保该节点的子树恢复平衡,同时更高层的节点也会因为子树高度的调整而自动满足平衡条件。
如果跳过最近的不平衡节点,直接调整更高层的节点,可能会导致低层节点再次失衡,从而需要额外的调整。
对于其它的旋转操作来说,都是为了保证AVL树的性质不变。
红黑树
特性1:节点非黑即红
特性2:根节点一定是黑色
特性3:叶子节点(NIL)一定是黑色
特性4:每个红色节点的两个子节点都为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
特性5:从任一节点到其每个叶子的所有路径,都包含相同数目的黑色节点。
从以上性质可以知道左右子树的高度差最大的时候是黑红相间,这样的规定使得调整平衡的操作相对于AVL比较少。
插入
- 规定插入的节点是红节点,如果是黑节点一定破坏了 特性5,而红节点有可能破坏 特性4.
叔叔为红

只好将 7 变红,3 ,9 变黑,同时将注意力放到 7 上递归向上。
叔叔为黑

只需要保证这棵子树的父节点为黑,并满足上述性质。
将 3 变黑,通过旋转,变为父节点,7 变红。
删除
- 如果是红色节点没有任何问题直接删除,如果是黑色节点则必定会违反 特性5.
如果删除后,将兄弟子树也去掉一个黑色节点,就要将注意力转移到它们的父节点上,递归向上。

删掉9将3变红,压力给到7.
如果要保持黑节点不变,就要旋转加变色,来保证红黑树的性质。
B树
可以知道的是上述 AVL 树和红黑树的高度较高,如果数据量较大的情况下,数据在硬盘上,访问一个节点时要进行一次硬盘操作。树高度和访问硬盘的操作正相关。所以我们要压缩树的高度,增加每个节点数据量。
- 平衡:所有叶节点都在同一层。
- 有序:节点内有序,任意元素的左子树小于它,右子树大于它。
- 对于m阶B树,节点最多有m个分支,m-1个元素。对于根节点,最少2个分支,一个元素,非根 $[m/2]$ 个分支,$[m/2] -1$个元素。

B树的插入删除操作和二叉搜索树的相似同时要满足节点最少和节点最大的条件,就不过多讨论。
B+树
- 与B树的不同:对于m阶B树,节点最多有m个分支,m个元素。对于根节点,最少2个分支,两个个元素,非根 $[m/2]$ 个分支,$[m/2]$个元素。

B树在顺序遍历的时候只能中序遍历,远没有B+树链式遍历的快。同样的 B+树也可以很方便的进行随机查找。
红黑树和b+树的更多相关文章
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写
在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间 ...
- 红黑树和AVL树的实现与比较-----算法导论
一.问题描述 实现3种树中的两种:红黑树,AVL树,Treap树 二.算法原理 (1)红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black.红黑树满足以 ...
- B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...
- 红黑树与AVL树
概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...
- AVL树与红黑树(R-B树)的区别与联系
AVL树(http://baike.baidu.com/view/593144.htm?fr=aladdin),又称(严格)高度平衡的二叉搜索树.其他的平衡树还有:红黑树.Treap.伸展树.SBT. ...
- 1.红黑树和自平衡二叉(查找)树区别 2.红黑树与B树的区别
1.红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单. 2.平衡 ...
- 二叉树、红黑树、伸展树、B树、B+树
好多树啊,程序猿砍树记,吼吼. 许多程序要解决的关键问题是:快速定位特定排序项的能力. 第一类:散列 第二类:字符串查找 第三类:树算法 树算法可以在辅助存储器中存储大量的数据. 二叉树.红黑树和伸展 ...
- AVL树,红黑树,B-B+树,Trie树原理和应用
前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...
- B树、B+树、红黑树、AVL树
定义及概念 B树 二叉树的深度较大,在查找时会造成I/O读写频繁,查询效率低下,所以引入了多叉树的结构,也就是B树.阶为M的B树具有以下性质: 1.根节点在不为叶子节点的情况下儿子数为 2 ~ M2. ...
随机推荐
- FFmpeg中的色彩空间与像素格式3-像素格式
FFmpeg 中的色彩与像素系列文章如下: [1]. FFmpeg中的色彩空间与像素格式1-色彩空间基础 [2]. FFmpeg中的色彩空间与像素格式2-RGB/YUV色彩空间 [3]. FFmpeg ...
- vue3项目中报错:Unexpected mutation of "xxx" prop
vue3 中element 弹窗绑定需要通过v-model,这个时候父级会传个dialogVisible(boolean值)过来,结果会报eslint的错. Unexpected mutation o ...
- 一套分布式IM即时通讯系统的技术选型和架构设计
本文由冰河分享,作者博客 binghe.gitcode.host,原题"这套分布式IM即时通讯系统如何写到简历上?我给你整理好了!",本文有修订和改动. 1.引言 分布式IM即时通 ...
- 利用SDCC开源项目搭建C51编译平台
下载sdcc 安装sdcc 安装sublime 新建编译系统输入以下内容 { "shell_cmd": "sdcc \"${file}\" " ...
- webpack使用详解
官网 官网:https://webpack.js.org 中文网:https://www.webpackjs.com 一.介绍 从webpack4.+进行介绍,会对Webpack常用配置一一讲解,各个 ...
- [.NET] 使用客户端缓存提高API性能
使用客户端缓存提高API性能 摘要 在现代应用程序中,性能始终是一个关键的考虑因素.无论是提高响应速度,降低延迟,还是减轻服务器负载,开发者都在寻找各种方法来优化他们的API.在Web开发中,利用客户 ...
- C# Unit test TestInitialize\TestCleanp
C# TestInitialize\TestCleanp ※※冰馨※※ 2020-12-15 09:19:37 75 收藏分类专栏: VS版权 VS专栏收录该内容197 篇文章1 订阅订阅专栏带有[C ...
- 如何快速的开发一个完整的iOS直播app(创建房间)
直播(创建房间) 1.进入主播界面,首先创建房间 2.设计房间模型(key,名称),key作为房间的唯一标识,用来找到房间 3.用socket创建房间,导入socket.io框架 4.一般一个客户端一 ...
- 工作流调度器-Azkaban
1.工作流调度器 1.为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后 ...
- Redis五种数据结构及真实应用场景
前言 如果问你redis有哪些数据结构,你肯定可以一口气说出五种基本数据结构: String(字符串).Hash(哈希).List(列表).Set(集合).zset(有序集合) 你或许还知道它还有三种 ...