紅黑樹的五個性質:
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)的速度進行查找和刪除