紅黑樹

    /** From CLR  新增一個節點之後需要修正樹的結構*/
    private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;//默認置成紅色,這樣做爲了把問題簡單化,可以考慮儘量少的情況

        while (x != null && x != root && x.parent.color == RED) {//如果父節點是紅色
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {//並且父節點爲左子樹,需要進行右旋
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {//如果叔叔節點是紅色的,則先進行變色
                    setColor(parentOf(x), BLACK);//父節點變成黑色
                    setColor(y, BLACK);//叔叔節點變成黑色
                    setColor(parentOf(parentOf(x)), RED);//爺爺節點變成紅色
                    x = parentOf(parentOf(x));//把爺爺節點賦值給當前節點
                } else {
                    if (x == rightOf(parentOf(x))) {//如果當前節點是右子樹,則進行左旋
                        x = parentOf(x);
                        rotateLeft(x);//左旋
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateRight(parentOf(parentOf(x)));
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateRight(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateLeft(parentOf(parentOf(x)));
                }
            }
        }
        root.color = BLACK;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章