红黑树的实现小结
2016-09-20 22:31
176 查看
红黑树是一棵自平衡二叉查找树
虽然很复杂但是效率很高,可以在O(log n)时间内做查找插入和删除
它的统计性能要比AVL树要好。
共有五点性质
根节点必须是黑色的
叶子节点和空节点都是黑色的
从任意 节点到叶子节点的所有路径上黑色节点的个数都是相同的。
红色的父亲它的孩子必须是黑色
只有红黑两种颜色
根到叶子的最长路径不可能是最短路径的二倍
1.红兄黑父
首先将红兄和黑父的颜色互换,然后旋转父节点(旋转的方向为向兄弟方向,如果N为P的左孩子,那么就左旋转P,如果是右孩子就右旋转P)旋转后根据N选择进入下面的情况进行处理
2.黑兄双黑侄黑父
将黑兄的颜色变成红色,然后调整父节点P(N=P,continue循环)
3.黑兄双黑侄红父
红父变成黑父,黑兄变成红兄 ,调整结束。
4.黑兄近红侄
黑兄变成红兄,近红侄变成黑侄,然后旋转兄弟节点B(旋转方向为朝着近红侄的方向,旋转结束后使得侄子变成兄弟,兄弟成为侄子,如果S为B的左孩子那么就右旋转,如果S为B的右孩子,那么左旋转),这时转到远红侄的情况
5.黑兄远红侄
兄弟颜色变成父亲的颜色,父亲的颜色变成黑色,将远红侄变成黑色(如果N为P的左孩子,那么将右侄子S变成黑色,否则左S变成黑色)然后旋转父节点(旋转的方向是朝向兄弟节点,如果N为P的左孩子,那么就左旋转P,如果是右孩子那么就右旋转P),调整结束。
红黑树的插入调整(N为当前删除的节点,P为父节点 U为叔叔节点 S为侄子节点)当父节点的颜色为红色的才进行调整。
根据父节点的兄弟节点也就是U叔叔节点的颜色进行分情况调整,
1.U为红色
将祖父节点的颜色变成红色,叔父节点和父节点都变成黑色,然后调整祖父节点。
2.U为黑色折线型
如果祖父,父,N构成的是折线形的结构,那么就旋转父节点(旋转方向是向N的方向,最终N为P父,如果N为右孩子那么就左旋,如果N为左孩子,那么就右旋)然后将N=P,也就是当前节点变成原来的父节点,然后就进入到了下面的情况。
3.U为黑色直线型
父节点变成黑色,祖父节点变成红色,然后旋转祖父节点(如果是左边的一条直线那么就右旋转,右边的一条直线就是左旋转)调整结束
虽然很复杂但是效率很高,可以在O(log n)时间内做查找插入和删除
它的统计性能要比AVL树要好。
共有五点性质
根节点必须是黑色的
叶子节点和空节点都是黑色的
从任意 节点到叶子节点的所有路径上黑色节点的个数都是相同的。
红色的父亲它的孩子必须是黑色
只有红黑两种颜色
根到叶子的最长路径不可能是最短路径的二倍
1.红兄黑父
首先将红兄和黑父的颜色互换,然后旋转父节点(旋转的方向为向兄弟方向,如果N为P的左孩子,那么就左旋转P,如果是右孩子就右旋转P)旋转后根据N选择进入下面的情况进行处理
2.黑兄双黑侄黑父
将黑兄的颜色变成红色,然后调整父节点P(N=P,continue循环)
3.黑兄双黑侄红父
红父变成黑父,黑兄变成红兄 ,调整结束。
4.黑兄近红侄
黑兄变成红兄,近红侄变成黑侄,然后旋转兄弟节点B(旋转方向为朝着近红侄的方向,旋转结束后使得侄子变成兄弟,兄弟成为侄子,如果S为B的左孩子那么就右旋转,如果S为B的右孩子,那么左旋转),这时转到远红侄的情况
5.黑兄远红侄
兄弟颜色变成父亲的颜色,父亲的颜色变成黑色,将远红侄变成黑色(如果N为P的左孩子,那么将右侄子S变成黑色,否则左S变成黑色)然后旋转父节点(旋转的方向是朝向兄弟节点,如果N为P的左孩子,那么就左旋转P,如果是右孩子那么就右旋转P),调整结束。
红黑树的插入调整(N为当前删除的节点,P为父节点 U为叔叔节点 S为侄子节点)当父节点的颜色为红色的才进行调整。
根据父节点的兄弟节点也就是U叔叔节点的颜色进行分情况调整,
1.U为红色
将祖父节点的颜色变成红色,叔父节点和父节点都变成黑色,然后调整祖父节点。
2.U为黑色折线型
如果祖父,父,N构成的是折线形的结构,那么就旋转父节点(旋转方向是向N的方向,最终N为P父,如果N为右孩子那么就左旋,如果N为左孩子,那么就右旋)然后将N=P,也就是当前节点变成原来的父节点,然后就进入到了下面的情况。
3.U为黑色直线型
父节点变成黑色,祖父节点变成红色,然后旋转祖父节点(如果是左边的一条直线那么就右旋转,右边的一条直线就是左旋转)调整结束
相关文章推荐
- bean:define、logic:present、logic:empty使用总结
- Lind.DDD.Domain.IOwnerBehavor对实体的意义
- scanf简单使用
- [javaSE] 注解-JDK中的注解
- 199 c 通过函数名字符串调用函数
- 快速排序Java实现
- hdu 5877 - Weak Pair (2016大连网络赛) 离散化 + 树状数组
- 拆分n个符号的方法
- Windows::Rtl::ObjAttrFromName
- css 移动端图片等比显示处理
- auto声明是数组不可以用动态数组n的变量
- linux常用命令总结与解析
- Go语言通过指令的方式拷贝文件
- 使用命令wsimport构建WebService客户端
- JSR303规范
- 权限控制之Shiro框架--初步了解篇
- 观察者模式
- 今日看点
- 分布式系统二、MogileFS
- 手把手教你Hibernate工程