数据结构之红黑树
- AVL树 (平衡二叉树) 最大作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。
- 如果在AVL树中插入或删除节点后,使得平衡因子大于1。此时,AVL树的平衡状态就被破坏,为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 那么创建一颗平衡二叉树的成本其实不小。
- 红黑树同样以平衡、高效的随机访问著称,节点数量越多,效率越高。
AVL树与红黑树
- AVL树的时间复杂度虽然优于红黑树,但是对于现在的计算机,可以忽略性能差异
- 红黑树的插入删除比AVL树更便于控制操作
- 红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树,不超过3次)
红黑树
红黑树是一棵二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡。
- 每个节点颜色不是黑色,就是红色
- 根节点是黑色的
- 每个叶结点(为null的结点)都是黑色的
- 如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
- 对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点
如上最段路径上全是黑结点,长路径保持相同数量黑结点,其长度小于短路径的2倍。
操作:
- 左旋:
- 右旋:
- 变色:结点的颜色由红变黑或由黑变红。
查找
红黑树总保持黑色完美平衡,所以它的查找最坏时间复杂度为O(2logN),也即整颗树刚好红黑相隔的时候。
红黑树的插入
按照二叉搜索树的方法进行节点插入,在插入新节点后根据情况进行颜色调整。
具体步骤:
- 根节点为NULL,直接插入新节点并将其颜色置为黑色
- 根节点不为NULL,找到要插入新节点的位置
- 插入新节点
- 判断新插入节点对全树颜色的影响,更新调整颜色
-
如果插入黑节点,这个可以直接插入无论它的父亲是什么颜色,但是红黑树的性质是每条路径的黑色节点数目相同,其他路径的黑色节点数目一定比你现在少一个节点,所以调整起来是非常繁琐的。
-
插入红节点不需要调整其他路径,如果它的父亲为黑,那么直接插入,如果他的父亲为红那么在该路径上面开始分情况调整.
所以插入节点默认颜色一定要为红。
接下来开始插入节点:
如果插入节点的父亲为黑那么直接插入后返回不需要做任何调整.。但是如果插入节点的父亲为红,就需要进行调整。
1.插入结点的父结点为红结点,叔叔结点存在并且为红结点
继续做插入操作自平衡处理,直到平衡为止。(唯一会增加红黑树黑色结点层数的插入情景。)