数据结构学习——红黑树

目录

 

1.红黑树

2.B-树

3.红黑树与4阶B-树的关系

4.B+树

5.各类树的应用场景


1.红黑树

红黑树(red-black tree),满足以下规则:

  1. 节点是红色或黑色;
  2. 根是黑色;
  3. 所有叶子都是黑色(叶子是NIL节点);
  4. 每个红色节点必须有两个黑色的子节点(从每个叶子到根的所有路径上不能有两个连续的红色节点);
  5. 从任一节点到其每个叶子(NIL)的所有简单路径都包含相同数目的黑色节点。

事实上,如上所有的规则都只想做一件事,让二叉树尽可能的平衡。

  1. 对于定义4,即代表了红黑树中不可能出现两个连续的红色节点,也就是说支树上最多是红黑交替的情况(可以出现连续的黑节点)。
  2. 对于定义5,结合定义4,即代表红黑树中最长路径最多是最短路径的两倍。红黑树的示意图如下:

2.B-树

所谓m阶B-树,即m路平衡搜索树,满足以下规则:

(1)树中每个结点至多有m 棵子树(注:m指的是树的阶);

(2)若根结点不是叶子结点,则至少有两棵子树(注:根节点至少有两个儿子);

(3)除根结点之外的所有非叶子结点至少有p个子节点(\left \lceil m/2 \right \rceil\leqslant p\leqslant m, \left \lceil m/2 \right \rceil为向上取整。);

(4)所有的非叶子结点中包含以下数据:(n,A0,K1,A1,K2,…,Kn,An)

     其中:

     Ki(i=1,2,…,n)为关键码,且Ki<Ki+1(注:ki是真实数据,存放在线性表当中,且从左至右升序排列)

     Ai 为指向儿子的指针(i=0,1,…,n),且指针Ai-1 所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An 所指子树中所有结点的            关键码均大于Kn。(注:每个ki数据两旁各安放了一个指针,即Ai-1和Ai,左边的子树数据统统小于ki,右边子树的数据统             统大于ki)(注:总体来看指针数量比数据数量多1)

      为关键码的个数\left \lceil m/2 \right \rceil-1\leqslant n\leqslant m-1)。

(5)所有的叶子结点都出现在同一层次上即所有叶节点具有相同的深度,等于树高度。并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。

由于各节点的分支数介于\left \lceil m/2 \right \rceil\leqslant p\leqslant m之间,故m阶B-树也称作(,m)树。以4阶B-树为例,其示意图如下:

3.红黑树与4阶B-树的关系

提升各红节点,使之与其(黑)父亲等高,于是每棵红黑树,都对应一棵4阶B-树((2,4)树 )。

将黑节点与其红孩子视作关键码并合并为超级节点,沿水平方向相邻的每一组节点即恰好构成4阶B树的一个节点。

4.B+树

一个M阶B+树具有如下几个特征:

  1. 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
  2. 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。

如下是一棵B+树,可以看到每一个父节点的元素都出现在子节点中,是子节点最大(或最小)的元素,如8,15。需要注意根节点的最大元素,也是整个B+树的最大元素,无论插入删除多少元素,始终要保持最大元素在跟节点当中。

卫星数据:指的是索引元素所指向的数据记录,例如数据库中的某一行。在B-树,无论中间节点还是叶子节点都带有卫星数据。 而在B+树当中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。因为B+树中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这意味着,数据量相同的情况下,B+树的结构比B-树更加矮胖,因此查询时IO次数也更少。

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

B+树的优势:

  1. 单一节点存储更多的元素,使得查询的IO次数更少。
  2. 所有查询都要查找到叶子节点,查询性能稳定。
  3. 所有叶子节点形成有序链表,便于范围查询。

5.各类树的应用场景

AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1。相比于红黑树,它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。因此AVL树适合用于插入删除次数比较少,但查找多的场合。

红黑树:平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的情况下我们就用红黑树来取代AVL。(现在部分场景使用跳表来替换红黑树,可搜索“为啥 redis 使用跳表(skiplist)而不是使用 red-black?”)

B-树/B+树:它们特点是一样的,是多路查找树,一般用于数据库系统中,为什么,因为它们分支多层数少呗,都知道磁盘IO是非常耗时的,而像大量数据存储在磁盘中所以我们要有效的减少磁盘IO次数避免磁盘频繁的查找。B+树是B树的变种树,有n棵子树的节点中含有n个关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文件系统而生的。

以上几种树都是有序的,如果你采用合适的算法遍历整个数,可以得到一个有序的列表。这也是为什么如果有数据库索引的情况下,你order by你索引的值,就会速度特别快,因为它并没有给你真的排序,只是遍历树而已。

Trie树:又名单词查找树,一种树形结构,常用来操作字符串。它是不同字符串的相同前缀只保存一份。相对直接保存字符串肯定是节省空间的,但是它保存大量字符串时会很耗费内存(是内存)。(类似于leveldb中block data可分为KV存储区和重启点信息存储区两部分,有共享前缀)

补充:前缀树(prefix tree),后缀树(suffix tree),radix tree(patricia tree, compact prefix tree),crit-bit tree(解决耗费内存问题),以及前面说的double array trie。

  • 前缀树:字符串快速检索,字符串排序,最长公共前缀,自动匹配前缀显示后缀。
  • 后缀树:查找字符串s1在s2中,字符串s1在s2中出现的次数,字符串s1,s2最长公共部分,最长回文串。
  • radix tree:linux内核,nginx。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
红黑树是一种自平衡的二叉查找树,它在插入和删除节点时能够保持树的平衡。红黑树的概念可以参考。在Java中实现红黑树,可以按照以下步骤进行: 1. 首先将红黑树当作一颗二叉查找树,将新节点插入到适当的位置上。 2. 将插入的节点着色为"红色"。 3. 根据红黑树的特性,通过一系列的旋转和着色等操作,使树重新保持红黑树的性质。 具体的插入过程可以参考中提供的代码。在代码中,使用了左旋转、右旋转和颜色翻转等操作来重新平衡红黑树。 首先,如果节点的右子树是红色而左子树是黑色,可以通过左旋转操作将其变为左子树为红色,右子树为黑色的情况。 其次,如果节点的左子树和左子树的左子树都是红色,可以通过右旋转操作将其修正为上述情况。 最后,如果节点的左子树和右子树都是红色,可以通过颜色翻转操作将其修正为左子树和右子树都为黑色的情况。 在插入完节点后,需要将根节点的颜色设置为黑色,以确保红黑树的性质满足。 这样,通过以上的步骤,就能够实现对红黑树的插入操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java数据结构红黑树的真正理解](https://download.csdn.net/download/weixin_38622475/12770272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java高阶数据结构红黑树](https://blog.csdn.net/qq15035899256/article/details/126678970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java数据结构——红黑树](https://blog.csdn.net/weixin_30699463/article/details/95256212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值