忘掉旋转,利用2-3-4树,学习红黑树 http://www.cnblogs.com/liuyunfeng/archive/2013/12/12/3471368.html
2015-11-25 14:52
429 查看
忘掉旋转,利用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节点。
这里没有使用旋转的概念,只是把等高的子树重新接入新的组合节点,感觉更容易理解。
[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(红黑树),/article/4975044.html
相关文章推荐
- charles中如何对https抓包
- Java Socket发送与接收HTTP消息简单实现
- httpclient绕过登陆验证码抓取数据
- 5、EIGRP DUAL网络收敛算法
- HP-SOCKET很好用的网络底层引擎
- 重温httpsession①
- Android网络编程六:(1)Universal-Image-Loader
- linux 内核参数调整优化网络
- RTP/RTCP/SRTP语音传输技术
- 安卓4.4.2网络优先级和默认网络
- beego 用golang 做http开发的框架
- HTTP状态码301和302的区别
- apache开启虚拟主机功能与httpd-vhosts.conf 配置
- Wireshark实战分析之TCP协议(一)
- android JSON与XmlPullParse解析网络连接数据
- java基础之网络(InetAdress、URL)
- 黑马程序员 JavaSE-13 网络编
- HTTP协议Keep-Alive模式详解
- 浅谈网络语音技术
- Ionic学习笔记五 跨域处理及HTTPS问题处理