红黑树RB-tree

转自http://www.cnblogs.com/zhangchaoyang

红黑树RB-tree

RB-tree是满足以下4个条件的二叉查找树:

  1. 每个节点不是红色就是黑色
  2. 根节点为黑色
  3. 不能存在两个连续的红色节点
  4. 任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同

红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。

以下所有操作,在新插入节点后,首先将新节点设为红色。

按照二叉查找树的规则插入新节点后,如果新增节点的父节点为黑,则直接插入。否则分为4种情况(在此作一些符号约定,新增节点为X,其父节点为P,祖父节点为G,伯父节点为S,曾祖父节点为GG):

红黑树RB-tree_第1张图片

  1. S为黑,且X为外侧插入。P,G做一次单旋转,并更改P,G的颜色。
  2. S为黑,且X为内侧插入。 X,P做一次单旋转,并更改X和P的颜色。再对X,G做一次单旋转。
  3. S为红,且X为外侧插入。 P,G做一次单旋转,并更改X的颜色。此时如果GG为黑,一切搞定;否则,还得继续往上做,直到不再有父子节点连续为红的情况。
  4. S为红,且X为内侧插入。直接更改P,S,G的颜色。此时如果GG为黑,一切搞定;否则,还得继续往上做,直到不再有父子节点连续为红的情况。

为了避免上述情况3、4中GG也为红的情况发生,我们设计一个“自顶向下”的红黑树。假设新增节点为A,那么就延着从根节点到A的路径,只要看到某个节点X的两个子节点皆为红色,就把这两个子节点改为黑色,同时把X改为红色。但是如果此时X的父节点也是红色(注意此时X的伯父节点已经不可能是红色),就像上述情况1那样作一次单旋转改变颜色,或像情况2那样做一些双旋转再改变颜色。

你可能感兴趣的:(红黑树RB-tree)