忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html

来源:互联网 发布:网络用语前方高能 编辑:程序博客网 时间:2024/05/03 21:38

忘掉旋转,利用2-3-4树,学习红黑树

红黑树是每个节点都带有颜色属性的二叉查找树 ,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  • 性质1. 节点是红色或黑色。
  • 性质2. 根是黑色。
  • 性质3. 所有叶子都是黑色(叶子是NIL节点)。
  • 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 性质5. 从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。

这些性质保证了根节点到任意节点的路径长度,最多相差一半。因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数。

利用2-3-4树可以比较容易地理解红黑树。所有红色节点都与父节点构成3或4节点,其它节点为2节点。

 

在插入/删除操作的时候,考虑到这种对应关系,比较容易理解:

插入操作:

  1. 空树:成为黑色根节点
  2. 父节点P为黑色:将新节点N涂红插入
  3. 父节点P为红色
    1. 将新节点N涂红插入
    2. 从叔父U节点的颜色,判断是3还是4节点
      1. 3节点简单扩充为4节点:例如插入红5到上图的(黑1红6)就变成了(红1黑5红6),子树按照顺序接入该节点即可。
      2. 4节点扩充为一个2节点和一个3节点,对2节点递归:例如插入红20到上图的(红22黑25红27)就变成了(红25黑27)与(红20黑22红6),红25的左子树为黑22;然后在红25上递归,解决可能的红色节点相邻的问题(性质4)。

 

删除操作:用子树上的节点替换要删除的节点,新的待删除的节点N成为最多只有一个子树的节点。

  1. N为根节点或者N为红色节点:将子树放入N的位置
  2. N为黑色节点,父节点P为红色:把3或4节点降阶为2或3节点,下移节点P与其N的兄弟节点S构成一个新的3节点,其中S为树根。
  3. N为黑色节点,父节点P为黑色:
    1. 兄弟节点S为黑色
      1. S的子节点都为黑:涂红节点S,在P的位置上递归,解决黑色节点短缺的问题(性质5)。
      2. S的子节点不都为黑:即为3或4节点,分裂之,取其中一个节点成为新的根
    2. 兄弟节点S为红色:P 与S构成了3节点,将其降为2节点。

 

 

这里没有使用旋转的概念,只是把等高的子树重新接入新的组合节点,感觉更容易理解。

[1] 2-3-4树,http://zh.wikipedia.org/wiki/2-3-4%E6%A0%91

[2] 红黑树,http://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91

[3] 从2-3-4树谈到Red-Black Tree(红黑树),http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html

0 0