忘掉旋转,利用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节点。
在插入/删除操作的时候,考虑到这种对应关系,比较容易理解:
插入操作:
- 空树:成为黑色根节点
- 父节点P为黑色:将新节点N涂红插入
- 父节点P为红色
- 将新节点N涂红插入
- 从叔父U节点的颜色,判断是3还是4节点
- 3节点简单扩充为4节点:例如插入红5到上图的(黑1红6)就变成了(红1黑5红6),子树按照顺序接入该节点即可。
- 4节点扩充为一个2节点和一个3节点,对2节点递归:例如插入红20到上图的(红22黑25红27)就变成了(红25黑27)与(红20黑22红6),红25的左子树为黑22;然后在红25上递归,解决可能的红色节点相邻的问题(性质4)。
删除操作:用子树上的节点替换要删除的节点,新的待删除的节点N成为最多只有一个子树的节点。
- N为根节点或者N为红色节点:将子树放入N的位置
- N为黑色节点,父节点P为红色:把3或4节点降阶为2或3节点,下移节点P与其N的兄弟节点S构成一个新的3节点,其中S为树根。
- N为黑色节点,父节点P为黑色:
- 兄弟节点S为黑色
- S的子节点都为黑:涂红节点S,在P的位置上递归,解决黑色节点短缺的问题(性质5)。
- S的子节点不都为黑:即为3或4节点,分裂之,取其中一个节点成为新的根
- 兄弟节点S为红色:P 与S构成了3节点,将其降为2节点。
- 兄弟节点S为黑色
这里没有使用旋转的概念,只是把等高的子树重新接入新的组合节点,感觉更容易理解。
[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
- 忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html
- 忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html
- Bat命令学习 http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html
- http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html
- 从2-3-4树谈到Red-Black Tree(红黑树) http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html
- 从2-3-4树谈到Red-Black Tree(红黑树) http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html
- 从2-3-4树谈到Red-Black Tree(红黑树) http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html
- NDbUnit学习总结(转自:http://www.cnblogs.com/icebutterfly/archive/2009/05/12/1454869.html)
- Windows消息机制http://www.cnblogs.com/watsonyin/archive/2005/12/12/295536.html
- http://www.cnblogs.com/sihai6b204/archive/2008/12/12/1353641.html
- c#编写网络电话 转自http://www.cnblogs.com/dfsxh/archive/2008/12/16/1355886.html
- c#编写网络电话 转自http://www.cnblogs.com/dfsxh/archive/2008/12/16/1355886.html
- http://www.cnblogs.com/AndyGe/archive/2009/12/17/1614402.html
- 深入浅出JSON (转http://www.cnblogs.com/truly/archive/2006/12/31/608896.html)
- JPA & Hibernate 注解 (转http://www.cnblogs.com/minideas/archive/2010/12/31/1922672.html)
- http://www.cnblogs.com/end/archive/2011/04/12/2013805.html
- http://www.cnblogs.com/iminto/archive/2010/12/23/1915232.html
- http://www.cnblogs.com/zc22/archive/2007/12/07/986978.html
- Error:Execution failed for task ‘:Test:dexDebug’.。。。finished with non-zero exit value 1
- MapReduce程序运行错误:The auxService: mapreduce_shuffle does not exist
- 左右滑动删除ListView条目Item(SwipeToDismiss)
- 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- 编程今年的感谢
- 忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html
- HashSet和TreeSet
- memcached的常用命令
- 修改Nexus的工作目录(sonatype-work)
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- js入门(八)——Global与Date
- 使用ANT打包Android应用
- WPF 字体设置
- android project ant build