什么是红黑树?

一、红黑树的产生

1.二叉树

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

2.二叉查找树

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

 

二叉查找树

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

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

在这里插入图片描述

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

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

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

二、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的数量

 

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

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

依次插入1、2、3节点

preview

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

preview

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

 

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

 插入7,形成新的4节点

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

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

preview

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

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

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

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

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

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

在这里插入图片描述

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

image_thumb53

image_thumb54

 

 

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

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值