二叉搜索树——红黑树
红黑树
- 概念
- 红黑树的原理
- 红黑树的效率
- 红黑树的插入规则
- 变色
- 旋转+变色
- 红黑树的验证
- 代码如下
概念
红黑树本质也是一颗二叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。
红黑树与AVL树相比对于平衡的要求更加宽松,也就是说红黑树相比于AVL树是少了很多旋转的过程。
红黑树的创建需要遵循以下四个规则
- 每个结点不是红⾊就是⿊⾊
- 根结点是⿊⾊的
- 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红⾊结点。
- 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点。
注意:第四点是要求到所有的NULL结点而不是叶子结点,因此在《算法导论》中,其将所有的NULL结点写成黑色的NIL。
红黑树的原理
红黑树是如何确保最长路径不超过最短路径的两倍的?
- 由规则4可知,从根到NULL结点的每条路径都有相同数量的⿊⾊结点,所以极端场景下,最短路径就就是全是⿊⾊结点的路径,假设最短路径⻓度为bh(black height)。
- 由规则2和规则3可知,任意⼀条路径不会有连续的红⾊结点,所以极端场景下,最⻓的路径就是⼀⿊⼀红间隔组成,那么最⻓路径的⻓度为2*bh。
- 综合红⿊树的4点规则⽽⾔,理论上的全⿊最短路径和⼀⿊⼀红的最⻓路径并不是在每棵红⿊树都存在的。假设任意⼀条从根到NULL结点路径的⻓度为x,那么bh <= h <= 2*bh。
红黑树的效率
如果N是红黑树的结点,h是最短路径长度,所以2h<=N<22*h-1,所以时间复杂度约为logN
红黑树的插入规则
变色
首先,插入的结点一定是红色的,因为这才不会改变整体每条路径上的黑色结点数目,这里就需要进行分类了
- parent直接为黑色,直接插入红色结点即可。
- parent为红色,由于不能有连续的红色结点,所以需要将parent变为黑色,但由于需要保证黑色结点数目不变,这里如果uncle存在且为红,就将parent与uncle都变为黑色,同时将grandparent变为黑色。
这两种情况只需要进行变色处理而不用旋转
旋转+变色
如果uncle存在且为黑色或者uncle不存在,那就需要进行旋转+变色,如果是这样
// g
// p u
// c
//或者
// g
// p
//c
就进行右单旋+变色,将parent变为黑色,grandparent变为红色,其余情况就不一一列举,有右单旋+变色,有双旋+变色,旋转的情况和AVL其中一样。
红黑树的验证
验证该树是不是红黑树,其实只需要判断每条路径上面的黑色结点是否相同即可
代码如下
红黑树