什么是红黑树?

一、红黑树的产生

1.二叉树

定义:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

什么是红黑树?_第1张图片

2.二叉查找树

定义:二叉查找树(BST,binary search tree),就是在二叉树的基础上增加有序性,这个有序性一般是指自然顺序,有了有序性,我们就可以使用二叉树来快速的查找、删除、插入元素了。

 

什么是红黑树?_第2张图片

 比如,上面这颗二叉查找树,查找元素的平均时间复杂度为O(log n)。

但是,如果插入的数据的顺序较为特殊时,二叉查找树有可能会变成类似链表的结构:

什么是红黑树?_第3张图片

所以,在极限情况下,二叉查找树的时间复杂度是非常差的。

既然,插入元素后有可能导致二叉查找树的性能变差,那么,我们是否可以增加一些手段,让插入元素后的二叉查找树依然性能良好呢?

为了解决浪费计算机性能以及浪费时间复杂度等问题,从而诞生了红黑树。

二、2-3-4树

2-3-4树先被提出来,后来红黑树由它发展而来。所以我们先来了解一下2-3-4树。

1.2-3-4树

定义:2-3-4树是平衡树,但不是二叉树,因为它可以有多个节点值,也可以有多个节点。它可以实现完美平衡。

2-3-4树所有叶子节点都包含相同深度。

2.名字的含义

2-3-4树中的2、3、4的含义指的是一个节点可能含有的子节点数。对非子叶节点有三种可能的情况:

  • 二节点
    • 一个key和左右两个链接;其中key大于左链接、小于右链接
  • 三节点
    • 包含两个key和三个链接(两个key分别称为key1和key2,key1小于key2)
    • 1、2、3三个子链接(子链接1的key小于根结点key1、子链接2的key大于根结点key1且小于根结点key2、子链接3的key大于根结点key2)
  • 四节点
    • 包含三个key和四个子链接(三个key分别为key1、key2、key3且从小到大排列)
    • 1、2、3、4三个子链接(子链接1的key小于根结点key1、子链接2的key大于根结点key1且小于根结点key2、子链接3的key大于根结点key2且小于根结点key3、子链接4的key大于根结点key3)
  • 上述的节点计数指子链接的数量,而非节点包含的key的数量

 

什么是红黑树?_第4张图片

3.构建2-3-4树(2-3-4树(b树)都是自下向上生长的

插入操作--我们把1-10的数字拆入到一棵234树中

依次插入1、2、3节点

什么是红黑树?_第5张图片

 插入4节点,需要将4节点分裂成3个2节点的操作

什么是红黑树?_第6张图片

 插入5,形成一个新的4节点

什么是红黑树?_第7张图片

 

 插入6,形成一个新的5节点,分裂3、4、5,合并2、4

什么是红黑树?_第8张图片

 插入7,形成新的4节点

什么是红黑树?_第9张图片

 插入9,形成7、8、9的4节点 

什么是红黑树?_第10张图片

 插入10,形成7、8、9、10的5节点。合并8后,形成2、4、6、8的5节点。继续分裂2、4、6、8节点

什么是红黑树?_第11张图片

 到此,2-3-4树构建完毕

三、红黑树(内存最优的数据结构)

红黑树(Red Black Tree)是一种自平衡的二叉查找树。除了符合二叉查找树的基本特性外,它还具有下列附加特性:

1.每个节点是红色或黑色。
2.根节点永远是黑色。
3.每个叶子节点都是黑色的空节点(Null节点)。
4.若一个节点是红色的,那么他的子节点必须是黑色的。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到该节点的所有路径都包含相同数目的黑色节点。

这些约束强制了红黑树的关键性质: 从根节点到叶子节点的最长的可能路径不多于最短的可能路径的两倍长。

 下图中这棵树,就是一颗典型的红黑树:

什么是红黑树?_第12张图片

 将2-3-4树按照上述性质转换为红黑树

什么是红黑树?_第13张图片

什么是红黑树?_第14张图片

 

 

 欢迎探讨,如有错误敬请指正。

 

你可能感兴趣的:(数据结构)