歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

因此選擇出來 勞務派遣管理系統 的replacement為null

點擊: 次  來源:寶鼎軟件 時間:2017-06-16

原文出處: 五月的倉頡

紅黑樹移除節點

上文具體講授了紅黑樹的觀念,紅黑樹的插入及旋轉操縱,按照測試代碼成立起來的紅黑樹布局為:

因此選擇出來 勞務調派打點系統 的replacement為null

本文先研究一下紅黑樹的移除操縱是如何實現的,移除操縱較量巨大,詳細移除的操縱要舉辦屢次旋轉和移除的節點在紅黑樹中的位置有關,這里也不特意憑據旋轉次數選擇節點了,就找三種位置舉例演示紅黑樹移除操縱如何舉辦:

  • 移除根節點,例子就是移除節點30
  • 移除中間節點,例子就是移除節點70
  • 移除最底下節點,例子就是移除節點85
  • 首先來過一下TreeMap的remove要領:

    public V remove(Object key) {
        Entry<K,V> p = getEntry(key);
        if (p == null)
            return null;
    
        V oldValue = p.value;
        deleteEntry(p);
        return oldValue;
    }

    第2行的代碼是獲取待移除的節點Entry,做法很簡樸,拿key與當前節點按指定算法做一個較量獲取cmp,cmp=0暗示當前節點就是待移除的節點;cmp>0,取右子節點繼承較量;cmp<0,取左子節點繼承較量。

    接著重點跟一下第7行的deleteEntry要領:

    private void deleteEntry(Entry<K,V> p) {
        modCount++;
        size--;
    
        // If strictly internal, copy successor's element to p and then make p
        // point to successor.
        if (p.left != null && p.right != null) {
            Entry<K,V> s = successor(p);
            p.key = s.key;
            p.value = s.value;
            p = s;
        } // p has 2 children
    
        // Start fixup at replacement node, if it exists.
        Entry<K,V> replacement = (p.left != null ? p.left : p.right);
    
        if (replacement != null) {
            // Link replacement to parent
            replacement.parent = p.parent;
            if (p.parent == null)
                root = replacement;
            else if (p == p.parent.left)
                p.parent.left  = replacement;
            else
                p.parent.right = replacement;
    
            // Null out links so they are OK to use by fixAfterDeletion.
            p.left = p.right = p.parent = null;
    
            // Fix replacement
            if (p.color == BLACK)
                fixAfterDeletion(replacement);
        } else if (p.parent == null) { // return if we are the only node.
            root = null;
        } else { //  No children. Use self as phantom replacement and unlink.
            if (p.color == BLACK)
                fixAfterDeletion(p);
    
            if (p.parent != null) {
                if (p == p.parent.left)
                    p.parent.left = null;
                else if (p == p.parent.right)
                    p.parent.right = null;
                p.parent = null;
            }
        }
    }

    用流程圖整理一下這里的邏輯:

    因此選擇出來 勞務調派打點系統 的replacement為null

    下面團結實際代碼來看下。

    因此選擇出來 勞務調派打點系統 的replacement為null

    移除根節點

    按照上面的流程圖,根節點30閣下子節點不為空,因此要先選擇擔任者,選擇擔任者的流程為:

    因此選擇出來 勞務調派打點系統 的replacement為null

    分點整理一下移除節點30做了什么:

    1. 由于節點30的右子節點不為空,因此從節點70開始不絕取左子節點直到取到葉子節點為止,最終取到的節點s為節點50
    2. p的key=s的key即50,p的value=s的value即50,由于此時p指向的是root節點,因此root節點的key和value變革,變為50–>50
    3. p=s,即p本來指向的是root節點,此刻p指向s節點,p與s指向同一份內存空間,即節點50
    4. 接著選擇replacement,由于p與s指向同一份內存空間,因此replacement判定的是s是否有左子節點,顯然s沒有,因此replacement為空
    5. replacement為空,可是p有父節點,因此可以判定出來p也就是節點50不是root節點
    6. 接著按照流程圖可知,節點p是一個赤色節點,這里不需要舉辦移除數據批改
    7. 最后節點p是其父節點的左子節點,因此節點p的左子節點置為null,再將p的父節點置為null,相當于把節點p移除

    顛末上述流程,移除根節點30之后的數據布局如下圖:

    因此選擇出來 勞務調派打點系統 的replacement為null

    移除中間節點

    排列三305组选前后关系 排列三试机号十期 pc蛋蛋自动答题 今天股市大盘行情 3d开奖结果走势图 投资理财产品排行 广西快3预测分析 新浪双色球20044 福建体彩11选五爱彩乐 排列五走势图表图 广西十一选五开奖官网