红黑树的实现小结
来源:互联网 发布:足球阵容设计软件 编辑:程序博客网 时间:2024/06/06 16:50
红黑树是一棵自平衡二叉查找树
虽然很复杂但是效率很高,可以在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为黑色直线型
父节点变成黑色,祖父节点变成红色,然后旋转祖父节点(如果是左边的一条直线那么就右旋转,右边的一条直线就是左旋转)调整结束
- 红黑树的实现小结
- 无锁队列的实现 小结
- jquery构造器的实现代码小结
- hiredis中异步的实现小结
- Android自定义View的实现小结
- 某网站静态首页的实现小结
- mybatis的dao接口实现小结
- 高德地图的实现小结
- Gabor滤波小结的OpenCV实现
- Java对象池技术的原理及其实现的小结。
- Java对象池技术的原理及其实现的小结
- 用Microsoft SDK实现中文语音发音的方法小结
- DivCSS教程:实现div容器垂直居中的方法小结
- js文件中调用js的实现方法小结
- CSS中多列块的实现小结 display : inline-block 内联块
- 问题小结(10)-android中ping命令的实现
- ASP.NET 中 “返回上一页”的实现方法小结
- xml文件读取和写入的实现方式小结
- 快速排序Java实现
- 199 c 通过函数名字符串调用函数
- 命令模式
- unity3d--杂记
- MySQL 触发器简单实例
- 红黑树的实现小结
- Android基本控件——Toast
- 四种常用的函数调用惯例
- POJ题目分类
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
- 为什么程序员都是夜猫子?
- 状态模式
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- 一个Demo学会用Android兼容包新控件