树(Tree)——(八)红黑树RB Tree理论篇

平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logN)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 那么创建一颗平衡二叉树的成本其实不小.

这个时候就有人开始思考,并且提出了红黑树的理论,那么红黑树到底比AVL树好在哪里?

红黑树与AVL树的比较:

1.AVL树的时间复杂度虽然优于红黑树,但是对于现在的计算机,cpu太快,可以忽略性能差异 
2.红黑树的插入删除比AVL树更便于控制操作 
3.红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)

 

红黑树的性质:

红黑树是一棵二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡。

具体性质如下:

  1. 每个节点颜色不是黑色,就是红色
  2. 根节点是黑色的
  3. 每个叶结点,即空结点(NIL)是黑的。
  4. 如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
  5. 对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点("黑高度相同"),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

红é»æ 

在这里简单介绍下插入和删除。

插入节点

先我们将红黑树当作一颗二叉查找树,当把节点插入时,先找到合适的位置插入,然后将插入节点初始着色为红色,此时红黑树的只有性质4可能会违反!主要有如下几种情况:(注:插入节点cur,父结点 parent,祖父节点pParent,叔节点uncle)

  • 如果父结点(存在)是黑色的话,说明插入成功,不需要改变。
  • 若父节点为红色,则红黑树性质被破坏,需要进行调整。

    case1:
    当叔父节点为红时(插入节点为6,父节点7,祖父节点8,叔节点为9)
    =》 =》

    处理方法:将父结点和叔父结点变为黑色,祖父结点变为红色。将祖父结点作为新插入的结点继续向上迭代进行平衡操作,在迭代时如果调整到根,则根为黑色,跳出循环(否则继续循环,循环结束条件为当前节点的父节点颜色为黑色),调整完毕。

    case2:
    叔父节点为黑,插入节点,父亲节点,祖父节点三者不在一条直线上(插入节点为24,叔父节点为黑色(空叶子节点为黑色))
    =》
     处理方法:以父亲节点右旋(若插入节点是父亲节点的右儿子则左旋),将父亲节点看为新的插入节点(即图中的插入节点变为22),将情况转化为case3,交给case 3处理。

    case3:
    叔父节点为黑,插入节点,父亲节点,祖父节点三者在一条直线上(插入节点黑21,叔父节点为黑色(空叶子节点为黑色))
    =》
     处理方法:交换父亲节点和祖父节点的颜色,然和以祖父节点右旋(如若这根直线是斜向下的则进行左旋操作),则调整结束。

删除节点

我们知道删除节点需先选择左儿子中的最大元素或者右儿子中的最小元素取代待删除节点的位置,从而达到删除结点的目的,替代点N至少有一个子节点为NULL。

  • 若替代点N为红色,则两个子节点一定都为NULL(必须地),此时我们可以直接将替代点的值放到待删除节点的位置上,从而不违反任何性质。
  • 若替代点N为黑色,则其只有一个节点M不为NULL,且一定是红色的,此时M的子节点都为NULL,那么把N删掉时(替代点N要取代待删除节点的位置),用M替代N的位置,并改为黑色,也不违反任何性质。
  • 当N为黑色,但两个结点都为NULL,此时把N删掉,会使此路径上的一个黑节点被删除了,从而破坏了性质5,这种情况是比较麻烦的,主要有如下几种情况: 
    1. 兄弟结点S为红色,且N是父结点P的左孩子(或者N是P的右孩子)。因为P的左边路径上少了一个黑节点,此时要将P变红色,S变黑色,并以P为中心S向左旋(或者是右旋对应N是P的右孩子),此时再删除N。 
      è¿éåå¾çæè¿°
    2.  P、S及S的孩子们都为黑。将S改为红色,此时从P出发到其叶子节点到所有路径所包含的黑节点数目相等了。但还需把P当做新的起始点开始向上调整 
      è¿éåå¾çæè¿°
    3. P为红,S及S的孩子们都为黑。此时将P改为黑,S改为红,因为P的路径上的黑结点数目没有发生变化,只需要直接删除N,就能完成调整。 
      è¿éåå¾çæè¿°
    4. 当S为黑,N是P的左孩子,S的右孩子SR为红,S的左孩子任意(或者是N是P的右孩子,S的左孩子为红,S的右孩子任意)。将SR(SL)改为黑,P改为黑,S改为P的颜色,并以P为中心S向左左旋(或者是右右旋对应N是P的右孩子),然后直接删除N,就能完成调整。 
      è¿éåå¾çæè¿°
    5. 当S为黑,N是P的左孩子,S的左孩子SL为红,S的右孩子SR为黑(或者N是P的有孩子,S的右孩子为红,S的左孩子为黑)。将SR(SL)改为黑,P改为黑,S改为P的颜色,并以P为中心S向右左旋(或者是左右旋对应N是P的右孩子),然后直接删除N,就能完成调整。 

      è¿éåå¾çæè¿°


红黑树演示网站 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html


转自:

https://blog.csdn.net/tostq/article/details/52727550 

https://blog.csdn.net/tanrui519521/article/details/80980135#commentBox

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/88890599