红黑树(上):为什么工程中都用红黑树这种二叉树?

红黑树(上):为什么工程中都用红黑树这种二叉树?

为了解决复杂度退化的问题,设计了一种平衡二叉树

平衡二叉查找树

二叉树中任意一个节点的左右子树的高度相差不能大于1,完全二叉树和满二叉树都是平衡二叉树,但是非完全二叉树有可能是平衡二叉树

很多平衡二叉查找树其实并没有严格符合定义(树中任意一个节点的左右子树的高度相差不能大于1),比如红黑树,它从根节点到各个叶子节点的最长路径,有可能比最短路径大一倍

发明平衡二叉查找树的初衷是解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题,所以“平衡”的意思就是让整棵树看起来“对称”,不要出现左子树很高、右子树很矮的情况,高度相应低一些,相应的插入、删除等操作的效率高一些,只要树的高度不比log2n大很多,仍然可以说是一个合格的平衡二叉树

定义一棵“红黑树” (Red-Black Tree R-B Tree)

提到平衡二叉树,就是红黑树

是一种不严格的平衡二叉查找树,其中的节点,一类被标记为红色,另一类被标记为黑色,还得满足几个要求:

  • 根节点是黑色的
  • 每个叶子节点都是黑色的空节点null,也就是说叶子节点不存储数据
  • 任何相邻的节点都不能同时为红色,即红色节点被黑色节点隔开
  • 每个节点,从该节点到达其可达叶子节点的所有路径都包含相同数目的黑色节点

分析红黑树的性能是否平衡

只需要分析高度是否稳定趋近log2n即可

首先,如果我们将红色节点从红黑树中去掉,那单纯包含黑色节点的红色书的高度是多少?红色节点删除之后,有些节点没有父节点,直接拿父节点的父节点作为父节点,有可能直接变成四叉树。前面的定义有:从任意节点到可达的叶子节点的每个路径包含相同数目的黑色节点,从四叉树中取出某些节点,放到叶节点位置,四叉树就变成完全二叉树,所以,仅包含黑色节点的四叉树的高度,比包含相同节点个数的完全二叉树的高度要小,所以去掉红色节点的黑树的高度不超过log2n

现在知道只包含黑色节点的黑树高度,把红节点加回去,高度为?

有一个红色节点就必须至少有一个黑色节点,所以加入红色节点之后,最长路径不会超过2log2n

为啥工程中喜欢用红黑树?

AVL树是最先发现的平衡二叉查找树,是一种高度平衡的二叉树,查找效率非常高,但是每次插入、删除都要调整,所以对于频繁的插入、删除的数据集合,代价比较大

红黑树的高度近似log2n,所以插入、删除、查找操作的时间复杂度都是O(logn)

补充:2-3树

2-3树是二叉查找树的变种,2和3代表的是两种节点

2-节点即普通节点:包含一个元素,两条子链接

3-节点包含2个元素和3条子链接,两个元素A,B,左边的链接小于A节点,中间的链接指向介于A,B之间的值,右边的大于B节点

在插入过程中,从根节点开始比较,小于节点值往左继续与左子节点比,大于的继续与右子节点比,直到某结点左或右子节点为空,把值插入进去,如果将值插入一个2-节点,将2-节点扩充为3-节点,如是3-节点(1)3-节点没有父节点,即整棵树只有一个3-结点,将扩充为一个4-结点,将其分解为一个二叉树,依然平衡 (2)3-节点有一个2-节点的父节点,将3-节点扩充为4-节点,分解4-节点,将分解后的新树的父节点融入到2-节点的父节点中去 (3)3-节点有一个3-节点的父节点,将3节点扩充为4-节点,然后分解这个4-节点,新树父节点向上融合,上面的3-节点继续扩充,融合,分解,新树继续向上融合,直到父节点是2-节点为止,如果向上到根节点都是3-节点,将根节点扩充为4-节点,分解,整个树加一层,仍然平衡

2-3树用代码实现不方便,红黑树出现了

红黑树中红色黑色啥意思?

红黑树中,所有节点都是2-节点,为了体现出3-节点,将3-节点的两个元素用左斜红色的链接连接起来,即连接了两个2-节点来表示一个3-节点,红色节点标记代表指向其的链接是红链接,黑色表示就是普通的节点

红色节点是可以与其父节点合并为一个3-节点的

将红色链接放平,所有的叶子节点到根节点的距离都一样,且红链接只能是左链接,且a<b,b在上,为a的父节点

所以,红黑树满足:

  • 红链接均为左链接
  • 没有任何一个节点同时和两个红链接相连
  • 完美黑色平衡即任意空链接到根节点的路径上黑链接数量相同

https://www.cnblogs.com/tiancai/p/9072813.html

发布了76 篇原创文章 · 获赞 9 · 访问量 9196

猜你喜欢

转载自blog.csdn.net/ywangjiyl/article/details/104347110