1.红黑树的四大性质
(1)每个节点不是红色就是黑色;
(2)不可能有走在一起的红色节点;
(3)根节点都是黑色;
(4)每个红色节点的子节点都是黑色。叶子节点都是黑色。
(5)从一个结点到该结点的所有子孙结点的所有路径上包含相同数目的黑结点
2.红黑树的几种变换
(1)颜色变换
当前结点的父亲是红色,且它的祖父节点的另一个子结点也是红色(叔叔节点)时,进行如下操作:
把父节点设置为黑色;
把叔叔节点设置为黑色;
把祖父节点设置为红色;
把指针知道祖父结点,将其定义为当前结点。
(2)左旋
左旋条件:当前父结点是红色,叔叔结点是黑色的时候,且当前结点是右子树,左旋以父节点作为左旋;
void leftRotate(Node node){
Node tmp=node.right;
if(tmp.left!=null){
node.right=tmp.left;
node.right.parent=node;
}
if(node.parent==null){
tmp.parent=null;
root=tmp;
}else{
tmp.parent=node.parent;
if(node==node.parent.left){
node.parent.left=tmp;
}else{
node.parent.right=tmp;
}
}
tmp.left=node;
node.parent=tmp;
}
(3)右旋
右旋条件:父结点是红色,叔叔结点是黑色,且当前结点是左子树,左旋以父结点作为左旋
void rightRotate(Node node){
Node tmp=node.left;
if(tmp.right!=null){
node.left=tmp.right;
node.left.parent=node;
}
if(node.parent==null){
tmp.parent=null;
root=tmp;
}else{
if(node.parent.left==node){
node.parent.left=tmp;
}else{
node.parent.right=tmp;
}
}
tmp.right=node;
node.parent=tmp;
}