数据结构-红黑树RBT(简介)

红黑树简介

红黑树是一棵自平衡的二叉排序树,但是这个平衡注意了是弱平衡,而不是严格意义的平衡,平衡条件没有 AVL Tree 严格,红黑树的平衡条件是确保其没有一条路径比其他路径长出 2 倍。红黑树还具备如下性质:

  • 1.每个结点要么黑色要么红色
  • 2.根结点为黑色
  • 3.叶子结点必为黑色的空结点
  • 4.红色结点的两个子结点必为黑色结点(即不能有两个连续的红色结点相连)
  • 5.从任意结点到其每个叶子结点上的黑色结点数是一样的

红黑树在插入结点时最多经过两次旋转,在删除结点时最多经过三次旋转,在增删较多的场景中我们推荐使用红黑树,在几乎都是查询的场景中我们则推荐使用自平衡的排序二叉树 AVL Tree

在这里插入图片描述

构造红黑树思路

首先根结点是黑色,然后我们为了达到“从任意结点到其每个叶子结点上的黑色结点数是一样的”这一目的,所以我们每次都预设装上一个红色结点,但是预设装上红色结点的时候我们又需要满足“红色结点的两个子结点必为黑色结点”和“根结点为黑色”这两个条件,所以又需要经过变色和旋转操作调整使得最终的树满足红黑树的性质,这个调整过程比较复杂

红黑树的应用场景

java 容器类中的 TreeSet 和 TreeMap 都用到了红黑树的数据结构;java 8 中 HashMap 也用到了红黑树,当链表长度超过 8 的时候,链表会变成红黑树

与 AVL Tree 比较

红黑树与基本的自平衡的排序二叉树比较,我们会发现自平衡的排序二叉树是完全遵守平衡条件的,因此每次插入几乎都要改变树结构,所以实现上来讲自平衡的排序二叉树的增删的实现还是蛮麻烦的,而它的反复调整树结构的举措也影响了了其性能,这是它的最大弊端。它最棒的地方就在于能够快速查找(二分查找)

红黑树呢?红黑树不是严格的平衡二叉树, 它不会太频繁的破坏树的规则结构去调整,因此比 AVL Tree 的增删快速一些,但比他的搜索又要慢一点

二叉树如何演替为红黑树?

  • 二叉树 => 排序二叉树(BST):

    二叉树演替为排序二叉树,解决了结点快速查找的问题(二分查找),但是他存在一个问题就是特殊情况下,它呈线性的链表结构,这种结构其效率低下

  • 排序二叉树(BST)=> 自平衡的排序二叉树(AVL Tree):

    排序二叉树演替为自平衡的排序二叉树,可以杜绝上面说的特殊情况,因此它的查找总是高效的,但是由于自平衡的排序二叉树是非常严格的平衡二叉树,它在增删时候几乎总会调整树结构,因此在增删上性能很差

  • 自平衡的排序二叉树(AVL Tree)=> 红黑树(RBT):

    自平衡的排序二叉树演替为红黑树,算是一种策略上的折中,红黑树不是严格的平衡二叉树,它在增删上比自平衡的排序二叉树要好,但是论查找的话还是自平衡的排序二叉树最快

发布了197 篇原创文章 · 获赞 62 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/abcnull/article/details/104584170
今日推荐