紅黑樹-插入操做

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

相關文章
相關標籤/搜索