红黑树的实现小结

来源:互联网 发布:足球阵容设计软件 编辑:程序博客网 时间: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为黑色直线型
父节点变成黑色,祖父节点变成红色,然后旋转祖父节点(如果是左边的一条直线那么就右旋转,右边的一条直线就是左旋转)调整结束

0 0
原创粉丝点击