`

红黑树与平衡二叉树

 
阅读更多
性质1.节点是红色或黑色。

性质2.根节点是黑色。

性质3.每个叶子节点都是黑色的空节点(NIL节点)。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

旋转和颜色变化规则
1、添加的节点必须为红色

2、变色的情况:当前结点的父亲是红色,且它的叔结点也是红色:

  2.1 把父节点设置为黑色

  2.2 把叔节点设置为黑色

  2.3 把祖父节点设置为红色

  2.4 把当前指针定义到祖父节点,设为当前要操作的

3、左旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是右子树。

  3.1 以父节点作为左旋。

4、右旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是左子树。

  4.1 把父节点变成黑色

  4.2 把祖父节点变为红色

  4.3 以祖父节点右旋转

平衡二叉树(AVL)的性质
它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

区别:

1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。







二叉查找/搜索/排序树  BST  (binary search/sort tree)
或者是一棵空树;
或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;
(2)若它的右子树上所有结点的值均大于它的根节点的值;
(3)它的左、右子树也分别为二叉排序树。


注意:对二叉查找树进行中序遍历,得到有序集合。

平衡二叉树(Self-balancing binary search tree)  自平衡二叉查找树  又被称为AVL树(有别于AVL算法)
它是一 棵空树
或它的左右两个子树的高度差(平衡因子)的绝对值不超过1,
并且左右两个子树都是一棵平衡二叉树,
同时,平衡二叉树必定是二叉搜索树,反之则不一定

 平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)
 平衡二叉树:每个结点的平衡因子都为 1、-1、0 的二叉排序树。或者说每个结点的左右子树的高度最多差1的二叉排序树。

平衡二叉树的目的是为了减少二叉查找树层次,提高查找速度

平衡二叉树的常用实现方法有AVL、红黑树、替罪羊树、Treap、伸展树等


红黑树
    R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种平衡二叉树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树


红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(logN),效率非常之高。
    它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
    例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

B-树
B-树是一种多路搜索树(并不一定是二叉的)
1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
1、根结点至少有两个子女;

2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;

3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;

4、所有的叶子结点都位于同一层。

特点:
是一种多路搜索树(并不是二叉的):

1.定义任意非叶子结点最多只有M个儿子;且M>2;

2.根结点的儿子数为[2, M];

3.除根结点以外的非叶子结点的儿子数为[M/2, M];

4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

5.非叶子结点的关键字个数=指向儿子的指针个数-1;

6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的

子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

8.所有叶子结点位于同一层;

如:(M=3)


B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果

命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为

空,或已经是叶子结点;

B-树的特性:
1.关键字集合分布在整颗树中;

2.任何一个关键字出现且只出现在一个结点中;

3.搜索有可能在非叶子结点结束;

4.其搜索性能等价于在关键字全集内做一次二分查找;

5.自动层次控制;

B+树
B+ 树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。

用途:
B+ 树通常用于数据库和操作系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入。

B+树的定义
B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:
1.有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。

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

3.所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。 
通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。

B+树是B-树的变体,也是一种多路搜索树:
1.其定义基本与B-树同,除了:

2.非叶子结点的子树指针与关键字个数相同;

3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树

(B-树是开区间);

5.为所有叶子结点增加一个链指针;

6.所有关键字都在叶子结点出现;

如:(M=3)
 
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在

非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好

是有序的;

2.不可能在非叶子结点命中;

3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储

(关键字)数据的数据层;

4.更适合文件索引系统;

B*树:
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;


B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3
(代替B+树的1/2);

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据

复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父

结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分

数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字

(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之

间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

小结:
B-树:
多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键

字范围的子结点;

所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:
在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点

中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:
在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率

从1/2提高到2/3;
————————————————
版权声明:本文为CSDN博主「道法—自然」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyqwilliam/article/details/82935922
分享到:
评论

相关推荐

    平衡二叉树-红黑树的实现

    平衡二叉树-红黑树的实现

    红黑树、平衡二叉树、排序算法的java实现

    本文将深入探讨"红黑树"、"平衡二叉树"、"二叉树"、"二叉搜索树"以及"排序算法"这些关键概念,并在Java环境下进行实现。 首先,我们来理解"二叉树"。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,...

    VC二叉排序树和平衡二叉树计算程序

    - **红黑树**:红黑树是一种弱平衡二叉树,它允许节点不平衡,但通过红黑颜色规则保持一定的平衡,确保了最坏情况下的操作复杂度也是O(log n)。 **主要操作:** 1. **插入操作**:在插入节点后,需要进行旋转操作...

    java 二叉排序树与平衡二叉树的实现

    常见的平衡二叉树有AVL树和红黑树等。 在这个课程设计中,我们可能需要实现以下内容: 1. **二叉链表存储结构**:在Java中,可以使用类来表示节点,每个节点包含键、值、左子节点和右子节点的引用。节点类将作为...

    平衡二叉树c++模版

    在C++中实现平衡二叉树通常会采用AVL树或红黑树等经典结构。AVL树是一种自平衡的二叉搜索树,它的每个节点的两个子树的高度最大差别为1,这保证了在最坏情况下,AVL树的操作时间复杂度为O(logn)。而红黑树则是一种弱...

    中南民族大学平衡二叉树

    平衡二叉树的主要类型有AVL树和红黑树,它们都是为了解决普通二叉搜索树在最坏情况下性能退化成链表的问题。AVL树是最早被提出的自平衡二叉搜索树,其特点是任何节点的两个子树高度差不超过1,从而保证了查找效率在O...

    2015广工数据结构实验--平衡二叉树(包含源码和实验报告

    平衡二叉树,如AVL树或红黑树,是一种特殊的二叉搜索树,它的特点是左右子树的高度差不超过1,这确保了树的平衡性,从而保证了查找、插入和删除操作的时间复杂度为O(log n)。在实验中,学生将学习如何实现这些基本...

    数据结构平衡二叉树课程设计

    3. **红黑树**:红黑树是一种自平衡二叉查找树,每个节点标记为红色或黑色,遵循特定的规则以保持平衡。这些规则包括:每个节点要么是红色要么是黑色;根节点是黑色;每个叶子节点(NIL或NULL节点)是黑色;如果一个...

    红黑树的java实现 (二叉树也有)

    红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它的设计目标是尽可能地减少在插入、删除和查找等操作时的最坏情况下的时间复杂度。这种数据结构在Java中广泛应用于集合框架,如`java.util.TreeMap`和`java....

    红黑树&二叉树

    它分为不同的类型,如二叉搜索树(BST)、完全二叉树、满二叉树和平衡二叉树等。在二叉搜索树中,所有左子节点的值小于父节点,所有右子节点的值大于父节点,这使得搜索、插入和删除操作的时间复杂度为O(log n)。 ...

    平衡二叉树的演示操作(c语言)

    常见的平衡二叉树有AVL树和红黑树。AVL树是最早被提出的自平衡二叉搜索树,它要求每个节点的两个子树高度差不超过1,通过旋转操作(左旋、右旋)保持平衡。红黑树则是一种更宽松的平衡策略,允许节点不平衡,但保证...

    二叉排序树和平衡二叉树计算程序

    在"VC二叉排序树和平衡二叉树计算程序"中,很可能是包含了用C++(Visual C++,简称VC)编写的程序,用于实现二叉排序树和平衡二叉树(如AVL树或红黑树)的基本操作。这样的程序通常会包括节点结构定义、插入、删除和...

    java编写的二叉树的各种操作(包括二叉排序树和平衡二叉树)

    常见的平衡二叉树类型有AVL树和红黑树。 AVL树是一种自平衡的二叉排序树,它的平衡因子(左子树高度减去右子树高度)绝对值不超过1。在进行插入或删除操作后,AVL树会通过旋转来重新平衡。旋转分为四种:左旋、右旋...

    平衡二叉树数据结构课程设计

    平衡二叉树的主要类型包括AVL树和红黑树,它们都是为了克服普通二叉查找树在极端情况下可能出现的性能问题而设计的。AVL树是最早的自平衡二叉查找树,由G. M. Adelson-Velsky和E. M. Landis在1962年提出,它的主要...

    二叉树和平衡二叉树的C#实现源码

    红黑树则是一种弱平衡二叉树,它通过颜色属性(红色或黑色)来确保任何路径到叶子节点的长度不会超过两倍其他路径。红黑树在插入和删除节点后可能需要进行颜色翻转和旋转以保持其性质。 在C#实现中,红黑树会比AVL...

    高级数据结构代码 红黑树 二叉树 B树

    本资源包含关于三种高级数据结构的代码实现:红黑树、二叉树和B树。这些数据结构在实际编程中有着广泛的应用,尤其在算法设计、数据库系统、内存管理等领域。 首先,我们来看二叉树,它是数据结构中最基础也是最...

    二叉排序树与平衡二叉树的实现课程设计

    平衡二叉树(Balanced Binary Tree)是为了优化查找效率而引入的概念,常见的平衡二叉树类型有AVL树和红黑树等。平衡二叉树要求满足以下条件: 1. 左右子树的高度差不超过1,确保树的平衡,减少最坏情况下的查找...

    c++实现红黑树与查找数的性能比较

    然而,BST在最好的情况下(即树完全平衡时)也能达到与红黑树相同的性能。在查找操作上,两者在平均和最好情况下都有类似的性能,因为查找操作主要依赖于树的高度。 为了进一步分析性能,我们可以使用**基准测试** ...

    数据结构 课程设计 平衡二叉树的生成设计

    常见的平衡二叉树类型有AVL树和红黑树。 首先,我们需要了解AVL树,这是一种最早的自平衡二叉查找树。AVL树的每个节点都具有平衡因子,即左子树高度减去右子树高度。如果这个因子绝对值大于1,就需要进行旋转操作来...

Global site tag (gtag.js) - Google Analytics