91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現TreeMap

發布時間:2021-11-24 09:56:42 來源:億速云 閱讀:152 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何實現TreeMap的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

/**

  • The comparator used to maintain order in this tree map, or

  • null if it uses the natural ordering of its keys.


  • @serial
    */
    //自然排序
    private final Comparator<? super K> comparator;
    //根節點
    private transient Entry<K,V> root;

    /**

  • The number of entries in the tree
    */
    //大小
    private transient int size = 0;

public TreeMap() {
comparator = null;
}

public V put(K key, V value) {
Entry<K,V> t = root;//紅黑樹的根節點
if (t == null) {
compare(key, key); // type (and possibly null) check

        root = new Entry<>(key, value, null);//構造根節點,root沒有父節點,傳入null
        size = 1;
        modCount++;
        return null;
    }
    int cmp;
    Entry<K,V> parent;  //定義節點
    // split comparator and comparable paths
    Comparator<? super K> cpr = comparator; //獲得比較器
    if (cpr != null) {//定義了比較器,采用自定義比較器進行比較
        do {
            parent = t;//將紅黑樹根節點賦值給parent
            cmp = cpr.compare(key, t.key);
            if (cmp < 0)
                t = t.left;//指向左子節點
            else if (cmp > 0)
                t = t.right;//指向右子節點
            else
                return t.setValue(value);
        } while (t != null);
    }
    else {
        //自然排序,沒有指定比較器
        if (key == null)
            throw new NullPointerException();
        @SuppressWarnings("unchecked")
            Comparable<? super K> k = (Comparable<? super K>) key;
        do {
            parent = t;
            cmp = k.compareTo(t.key);
            if (cmp < 0)
                t = t.left;//左子節點
            else if (cmp > 0)
                t = t.right;//右子節點
            else
                return t.setValue(value);
        } while (t != null);
    }
    //創建新節點,并指定父點
    Entry<K,V> e = new Entry<>(key, value, parent);
    if (cmp < 0)
        parent.left = e;
    else
        parent.right = e;
    //新插入節點后重新調整紅黑樹
    fixAfterInsertion(e);
    size++;
    modCount++;
    return null;
}

/** From CLR */
private void fixAfterInsertion(Entry<K,V> x) {
    //加入的節點默認的顏色是紅色
    x.color = RED;
    //情形1:新節點x是樹的根節點,沒有父節點不需要任何操作
    //情形2:新節點x的父節點顏色是黑色的,不需要操作
    while (x != null && x != root && x.parent.color == RED) {
        //情形3:新節點的父節點顏色是紅色的
        //判斷x的節點的父節點位置,是否屬于左子節點
        if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
            //獲取x節點的父節點的兄弟節點,上面語句已經判斷出x節點的父節點為左子節點,所以直接取右子節點
            Entry<K,V> y = rightOf(parentOf(parentOf(x)));
            //判斷是否x節點的父節點的兄弟節點為紅色
            if (colorOf(y) == RED) {
                setColor(parentOf(x), BLACK);//x節點的父節點設置為黑色
                setColor(y, BLACK);//y節點的顏色設置為黑色
                setColor(parentOf(parentOf(x)), RED);//x的父節點的父節點設置為紅色
                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;
}

感謝各位的閱讀!關于“如何實現TreeMap”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太仓市| 米脂县| 象州县| 页游| 大宁县| 曲阳县| 江安县| 九龙县| 伊春市| 九寨沟县| 枣强县| 阿克陶县| 台北市| 云和县| 新余市| 婺源县| 遵义县| 剑河县| 军事| 黔西| 临颍县| 周至县| 重庆市| 清镇市| 佛学| 东光县| 永平县| 巴林左旗| 陈巴尔虎旗| 兰溪市| 娱乐| 洛阳市| 武汉市| 新巴尔虎右旗| 开平市| 呼伦贝尔市| 得荣县| 宣化县| 南平市| 云南省| 延庆县|