大话数据结构C语言61 红黑树和B+树

Posted 是CodeAllen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话数据结构C语言61 红黑树和B+树相关的知识,希望对你有一定的参考价值。

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源
程序员技术交流①群:736386324 
程序员技术交流②群:371394777    

红黑树(R-B TREE,全称:Red-Black Tree),本身是一棵二叉查找树,在其基础上附加了两个要求:

  1. 树中的每个结点增加了一个用于存储颜色的标志域;

  2. 树中没有一条路径比其他任何路径长出两倍,整棵树要接近于“平衡”的状态。

这里所指的路径,指的是从任何一个结点开始,一直到其子孙的叶子结点的长度;接近于平衡:红黑树并不是平衡二叉树,只是由于对各路径的长度之差有限制,所以近似于平衡的状态。

红黑树对于结点的颜色设置不是任意的,需满足以下性质的二叉查找树才是红黑树:

  • 树中的每个结点颜色不是红的,就是黑的;

  • 根结点的颜色是黑的;

  • 所有为 nil 的叶子结点的颜色是黑的;(注意:叶子结点说的只是为空(nil 或 NULL)的叶子结点!)

  • 如果此结点是红的,那么它的两个孩子结点全部都是黑的;

  • 对于每个结点,从该结点到到该结点的所有子孙结点的所有路径上包含有相同数目的黑结点;

 

 

注意:图中每个结点附带一个整形数值,表示的是此结点的黑高度(从该结点到其子孙结点中包含的黑结点数,用 bh(x) 表示(x 表示此结点)),nil 的黑高度为 0,颜色为黑色(在编程时为节省空间,所有的 nil 共用一个存储空间)。在计算黑高度时,也看做是一个黑结点。

红黑树中每个结点都有各自的黑高度,整棵树也有自己的黑高度,即为根结点的黑高度,例如图 1 中的红黑树的黑高度为 3。

 

对于一棵具有 n 个结点的红黑树,树的高度至多为:2lg(n+1)。

由此可推出红黑树进行查找操作时的时间复杂度为O(lgn),因为对于高度为 h 的二叉查找树的运行时间为O(h),而包含有 n 个结点的红黑树本身就是最高为 lgn(简化之后)的查找树(h=lgn),所以红黑树的时间复杂度为O(lgn)。

红黑树本身作为一棵二叉查找树,所以其任务就是用于动态表中数据的插入和删除的操作。在进行该操作时,避免不了会破坏红黑树的结构,此时就需要进行适当的调整,使其重新成为一棵红黑树,可以从两个方面着手对树进行调整:

  • 调整树中某些结点的指针结构;

  • 调整树中某些结点的颜色;

 

 


 

什么是B+树?

一颗 m 阶的 B+树和 m 阶的 B-树的差异在于:

  • 有 n 棵子树的结点中含有 n 个关键字;

    在上一节中,在 B-树中的每个结点关键字个数 n 的取值范围为⌈m/2⌉ -1≤n≤m-1,而在 B+树中每个结点中关键字个数 n 的取值范围为:⌈m/2⌉≤n≤m。

  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

  • 所有的非终端结点(非叶子结点)可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。

例如,图 1 中所示的就是一棵深度为 4 的 3 阶 B+树:

 

 

 

如图 1 所示,B+树中含有两个头指针,一个指向整棵树的根结点,另一个指向关键字最小的叶子结点。同时所有的叶子结点依据其关键字的大小自小而大顺序链接,所有的叶子结点构成了一个 sqt 指针为头指针的链表。

 

所有,B+树可以进行两种查找运算:一种是利用 sqt 链表做顺序查找,另一种是从树的根结点开始,进行类似于二分查找的查找方式。

 

在 B+树中,所有非终端结点都相当于是终端结点的索引,而所有的关键字都存放在终端结点中,所有在从根结点出发做查找操作时,如果非终端结点上的关键字恰好等于给定值,此时并不算查找完成,而是要继续向下直到叶子结点。

B+树的查找操作,无论查找成功与否,每次查找操作都是走了一条从根结点到叶子结点的路径。

 

以上是关于大话数据结构C语言61 红黑树和B+树的主要内容,如果未能解决你的问题,请参考以下文章

红黑树和B树

数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

B树和B+树的区别

说一下B+tree和二叉搜索树的区别?说一下二叉搜索树和AVL树红黑树之间的差别

算法红黑树-二叉树-算法

红黑树—红黑交响曲