红黑树

70 阅读3分钟

红黑树

红黑树是一种特化的AVL树平衡二叉树,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目(来源百度百科)

image.png

红黑树出现的原因:

线性查找 —性能低—>二分查找— 二查叉树会出现退化成链表的问题—>出现AVL平衡二叉树—数据变化有频繁更新节点问题—>出现红黑树

特性

是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。

  1. 结点是红色或黑色
  2. 根结点始终是黑色
  3. 叶子结点(NIL 结点)都是黑色
  4. 红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)
  5. 从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点

以上性质保证了红黑树在满足平衡二叉树特征的前提下,还可以做到 从根到叶子的最长路径最多不会超过最短路径的两倍。 左旋转

对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图:

425d081b737b94a0d3d50e05364665a2.png

右旋转

对于当前结点而言,如果左子、左孙子结点均为红色,则执行右旋转,如下图:

a94827545d100370a82f7f874e72b694.png

对于当前结点而言,如果左、右子结点均为红色,则执行变色,如下图:

af06c43704fa919abf309e8ebff03018.png

插入操作

红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位插入点,不过红黑树约定新插入的结点一律为红色,这主要也是为了简化树的自平衡过程。

删除操作

红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位删除点,在执行删除之前我们需要判断待删除结点有几个孩子结点, 如果是 2 个的话我们需要从结点的左子树中寻找值最大的结点,或者从右子树中寻找值最小的结点,并用结点值替换掉待删除结点(只要目标结点值从树上消失即可,不要纠结具体删除的是哪个结点)。这两个结点有一个共性,即最多只有一个孩子结点(因为已经是自己所处范围内的最大和最小了),此时就将需求转变成删除只有一个孩子结点的结点,相对要简单了许多。