红黑树的五个性质:
1)每一个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每一个叶结点,即空结点(NIL)是黑的。
4)若是一个结点是红的,那么它的俩个儿子都是黑的。
5)对每一个结点,从该结点到其子孙结点的全部路径上包含相同数目的黑结点。node
红黑树插入的几种状况:.net
一、树是空的,直接将节点设置为根节点,颜色为黑;blog
public void case1(RBnode T,RBnode newNode){
if(newNode.getParent()==null){
newNode.setColor(0);
T = newNode;
}else{
case2(T,newNode);
}
}递归
二、父节点是黑的,直接插在父节点下面get
public RBnode case2(RBnode T,RBnode newNode){
if(newNode.getParent().getColor()==0){
return T;
}else{
return case3(T,newNode);
}
}im
三、叔叔节点存在且节点的叔叔节点是红的img
将父节点和叔叔节点设置为黑色的,祖父节点设置为红色的,将当前节点设置为祖父节点,由于祖父节点是红色的,一、可能违反根节点是黑色的要求 ;二、因为祖父节点为红色,而祖父的父亲节点可能也是红色;综合一、2从case1开始,以祖父节点为当前节点进行递归。红黑树
public RBnode case3(RBnode T,RBnode newNode){
RBnode y = newNode.getParent().getParent().getRight();//叔父节点
if(y!=null&&y.getColor()==1){
newNode.getParent().setColor(0);//当前节点父节点和叔父节点涂黑,祖父节点涂红
y.setColor(0);
newNode.getParent().getParent().setColor(1);
case1(T,newNode);
return T;
}else{
return case4(T,newNode.getParent().getParent());
}
}co
四、叔叔节点为空或者叔叔节点是黑色,父亲节点是红色的状况cas
在这里又能够分为两种状况
(1)、当前节点为父节点的右子树,父亲节点为祖父节点的左子树
(2)、当前节点为父节点的左子树,父亲节点为祖父节点的右子树
上图是第一种状况
//情形4: 父节点P是红色,叔叔节点U是黑色或NIL; 插入节点N是其父节点P的右孩子,而父节点P又是其父节点的左孩子。(旋转父节点)
public RBnode case4(RBnode T,RBnode newNode){
if(newNode == newNode.getParent().getRight()&&newNode.getParent()==newNode.getParent().getParent().getLeft()){
leftRotate(T,newNode.getParent().getParent());
newNode = newNode.getLeft();
}else if(newNode == newNode.getParent().getLeft()&&newNode.getParent()==newNode.getParent().getParent().getRight()){
rightRotate(T,newNode.getParent().getParent());
newNode = newNode.getRight();
}
return case5(T,newNode);
}
继续通过状况5进行进一步的处理
五、父节点P是红色,叔叔节点U是黑色或NIL;(旋转祖父节点)
在这里又能够分为两种状况
(1)、当前节点为父节点的左子树,父亲节点为祖父节点的左子树
(2)、当前节点为父节点的右子树,父亲节点为祖父节点的右子树
public RBnode case5(RBnode T,RBnode newNode){
newNode.getParent().setColor(0);
newNode.getParent().getParent().setColor(1);
if(newNode == newNode.getParent().getLeft()&&newNode.getParent()==newNode.getParent().getParent().getLeft()){
rightRotate(T,newNode.getParent().getParent());
}else{
/* 反状况,N 是其父节点的右孩子,而父节点P又是其父G的右孩子 */
leftRotate(T,newNode.getParent().getParent());
}
return T;
}
删除操做:http://blog.csdn.net/chenhuajie123/article/details/11951777
红黑树能够保持O(logn)的速度进行查找和删除