红黑树

来自学习小组活动,整理下三锅的ppt,作为自己的学习笔记。

 

红黑树定义:

  红黑树是一种二叉查找树,但是在每个节点上增加了一个存储位表示节点的颜色(红或黑)。
  红黑树的一个概念:黑高度(bh)

红黑树性质:

1)每个结点要么是红的,要么是黑的。

2)根结点是黑的。

3)每个叶结点,即空结点(NIL)是黑的。

4)如果一个结点是红的,那么它的俩个儿子都是黑的。

5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

 

红黑树的插入:

红黑树是二叉查找树,所以插入的基本步骤和二叉查找树的基本步骤一致。
因为红黑树中每个节点有颜色限制,所以插入节点的颜色选择以及插入可能会影响红黑树的性质。
红或黑?
任何一个即将插入的新结点的初始颜色都为红色。这一点很容易理解,因为插入黑点会增加某条路径上黑结点的数目,从而导致整棵树黑高度的不平衡。
新点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。

•如果新结点父结点为红色时,将会违返红黑树性质:一条路径上不能出现相邻的两个红色结点。这时就需要通过一系列操作来使红黑树保持平衡。由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。

•当叔父结点为红色时,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上进行平衡操作。

当叔父结点为黑色时,需要进行旋转。

 

红黑树删除:

•删除一个节点,在不考虑红黑颜色的情况下,同二叉搜索树的删除操作类似(查找前驱或者后继)。最终我们会定位到最终要物理删除的那个节点上,这个节点x必然是叶子节点或者只有一个孩子的内节点。

•现在我们需要考虑的问题就是这个节点x是红色还是黑色的问题

  1. 如果x节点的颜色是红色,直接删除,对我们的黑高度没有影响
  2. 如果x节点是黑色,必然会导致该节点的红黑树的一支出现黑高度不一致的情况,这个时候,必须想办法在红黑树中找到一个红色节点,将其改变为黑色,以弥补这一缺陷(以下用旧节点来表示需要物理删除的节点,新节点表示物理删除后向上补齐的子节点)。

    2.1当旧点为黑色结点,新点为红色结点时,将新点取代旧点位置后,将新点染成黑色即可。

 

2.2.当旧点和新点都为黑色时(新点为空结点时,亦属于这种情况),情况比较复杂,需要根据旧点兄弟结点的颜色来决定进行什么样的操作。我们使用“兄”来表示旧点的兄弟结点。

  2.2.1)黑兄的情况最为复杂,需要根据黑兄孩子结点(这里用“侄”表示)和父亲结点的颜色来决定做什么样的操作。

    2.2.1.1黑兄二黑侄红父

    这种情况比较简单,只需将父结点变为黑色,兄结点变为黑色,新结点变为黑色即可,删除操作到此结束。

2.2.1.2黑兄二黑侄黑父

此时将父结点染成新结点的颜色(考虑到所有红色的情况已经解决,此时新节点只能是黑色),新结点染成黑色,兄结点染成红色即可。当新结点为红色时,父结点被染成红色,此时需要以父结点为判定点继续向上进行平衡操作。

2.2.1.3黑兄红侄

此时需要用到二叉平衡树的左旋右旋操作了

 

 

2.2.2红兄
红兄的情况需要进行旋转,然后将父结点染成红色,兄结点染成黑色。我们可以观察到,旋转操作完成后,判定点没有向上回溯,而是降低了一层,此时变成了黑兄的情况。





posted on 2012-03-26 15:48  aho  阅读(701)  评论(2编辑  收藏  举报

导航