主脉络参考http://www.cnblogs.com/skywang12345/p/3245399.html#!comments
补图删除操作:https://blog.csdn.net/eson_15/article/details/51144079
R-B Tree的在线生成:http://sandbox.runjs.cn/show/2nngvn8w
数据结构与算法汇总:http://www.cnblogs.com/skywang12345/p/3603935.html
红黑树 R-B Tree
1、红黑树的时间复杂度与特性
1.1 特性:
(1):每个节点不是黑色就是红色;
(2):根节点是黑色
(3):叶子结点(为空的叶子节点)是黑色
(4):若一个节点是红色,则其子节点必为黑色,反之不成立
(5):从一个节点到该节点的子孙节点的所有路径上有相同数目的黑节点。
1.2 时间复杂度:
(1):红黑树的时间复杂度是O(logn)。
(2):一颗含有n个节点的红黑树的高度至多为2*log(n+1);
2、左旋与右旋(旋转前后仍然是二叉查找树)
2.1:对x节点左旋:被旋转的节点成为一个左节点;
2.2:对x节点右旋:被旋转节点成为一个右节点;
z x / / \ --(左旋)--> x y z / y ------------------------------------ y x \ / \ --(右旋)--> x y z z
3、红黑树基本操作--添加
3.1:RB-Insert:
找到该节点的插入位置y,并将其染成红色;
3.2:RB-Insert-FixUp
3.2.1:被插入节点是根节点:着黑;
3.2.2:被插入节点父节点是黑色,直接插入
3.2.3:被插入节点父节点是红色:
case1:父节点红,叔叔节点红:
(1):父节点、叔叔节点设为黑
(2):祖父节点设为红
(3):以祖父节点为当前节点,再判断;
case2:父节点红,叔叔节点黑,插入节点是右孩子;
(1):以父节点为当前节点
(2):左旋,再判断;
case3:父节点红,叔叔节点黑,插入节点是左孩子:
(1):父节点设为黑;
(2):祖父节点设为红;
(3):以祖父节点为支点右旋;
4、红黑树的基本操作--删除
4.1:RB-delete:
(将后继节点设置为与删除节点相同的颜色,这样只处理后继节点原位置处的平衡)
4.1.1:被删除节点没有儿子,直接删除;
4.1.2:被删除节点只有一个儿子,直接删除,唯一子节点顶替;
4.1.3:被删除节点有两个儿子:找右孩子的左孩子,一直找下去(二叉搜索树的删除)。
4.2:RB-Delete-FixUP:
4.2.1:x为黑,兄弟节点是红(父节点和兄弟的字节点是黑);
(1)父节点设红,兄弟设黑,父节点左旋;
4.2.4:x为黑,兄弟节点是黑:
case1:兄弟两个子节点都是黑:
(1):兄弟节点设红;
(2):当前节点更新为祖父节点;
case2:兄弟左节点是红,右节点是黑:
(1):兄弟节点设红,兄弟左子节点设黑;
(2):以兄弟节点作右旋;
case3:兄弟左节点任意,右节点是红:
(1):兄弟节点设为父节点颜色;
(2):父节点设黑,兄弟右节点设黑;
(3):以父节点为支点左旋;
5:Java实现:
原文地址:https://www.cnblogs.com/whtblog/p/8968798.html