红黑树有什么特性?
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
node 当前节点
returnpoint
若node的父节点存在,且父节点是红色
|---- 若父节点是祖父节点的左孩子
| |---- 若叔叔节点是红色
| | |---- 叔叔节点与父节点变为黑色,祖父节点变为红色
| | |---- node赋值祖父节点,返回returnpoint
| |---- 若叔叔节点是黑色
| |---- 若node是父节点的右孩子
| | |---- 将现在的父结点存为tmp,左旋父节点
| | |---- 当前节点变为黑色,祖父节点变为红色
| | |---- 右旋祖父节点
| | |---- node赋值tmp,返回returnpoint,对旋转后的原父节点进行修复
| |---- 若node是父结点的左孩子
| |---- 父节点变为黑色,祖父节点变为红色
| |---- 右旋祖父节点
| |---- 返回returnpoint
|---- 若父节点是祖父节点的右孩子
|---- 若叔叔节点是红色
| |---- 叔叔节点与父节点变为黑色,祖父节点变为红色
| |---- node赋值祖父节点,返回returnpoint
|---- 若叔叔节点是黑色
|---- 若node是父节点的左孩子
| |---- 将现在的父结点存为tmp,右旋父节点
| |---- 当前节点变为黑色,祖父节点变为红色
| |---- 左旋祖父节点
| |---- node赋值tmp,返回returnpoint,对旋转后的原父节点进行修复
|---- 若node是父结点的右孩子
|---- 父节点变为黑色,祖父节点变为红色
|---- 右旋祖父节点
|---- 返回returnpoint
离开循环,说明当前节点为根节点,将当前节点变为黑色