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

溫馨提示×

溫馨提示×

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

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

《樹》之伸展樹

發布時間:2020-03-22 13:45:59 來源:網絡 閱讀:559 作者:Owefsad 欄目:開發技術

本文介紹什么?

  1. 使用伸展樹有什么樣的效果;

  2. 伸展樹的定義;

  3. 伸展樹ADT具體實現過程的描述;

  4. 代碼實現。





一、使用伸展樹(splay tree)的效果:

              使用伸展樹時,對伸展樹上任意一次操作的最壞運行時間為 O( N );但是,它保證了連續M次操作花費的最多時間為O(M ㏒N),從而可以推算出對伸展樹的每一次操作的攤還時間為O( ㏒N)。




二、伸展樹的定義:

        對于一顆二查查找樹進行操作時,每訪問一個節點,該節點都通過旋轉操作被放到根上。這樣的一顆二查查找樹稱為伸展樹。




三、伸展樹ADT的描述:

        1.伸展樹的節點定義與二查查找樹節點定義的方法一致,此處不再贅述;

        2.比起二查查找樹,伸展樹ADT只是對了一個旋轉操作。在這里的旋轉,我們稱之為展開(Splaying)。設節點X為訪問的節點,我們通過對節點X進行一系列操作,將節點X移動到根節點。

        3.節點X旋轉的情況:

             ⑴節點X為根節點:什么都不做;

             ⑵節點X的父節點為根節點:

                     根節點的左子樹=X的右子樹;

                     X的右子樹=根節點;

             ⑶節點X具有父節點(P)、祖父節點(G),此時有(兩類)四種情況需要考慮:

                     ⅰ、( "一" 字形) P是G的左兒子,X是P的左兒子;

                     ⅱ、( "一" 字形)P是G的右兒子,X是P的右兒子;

                     ⅲ、( "之" 字形)P是G的左兒子,X是P的右兒子;

                     ⅳ、( "之" 字形)P是G的右兒子,X是P的左兒子;

        4.節點的刪除:

              由于對節點X的每一次訪問都需要將X移向根節點,所以懶惰刪除在這里顯得不太合適,在這里需要進行的直接刪除。當進行刪除操作時,首先需要訪問節點X,節點X被移動到根節點,此時刪除X花費的代價是比較小的。在刪除節點X的時候,①訪問X導致節點X被移向根節點,刪除節點X并得到左、右兩棵子樹(TL、TR);②在右子樹TR上訪問最小節點Y(該節點一定沒有左兒子),將Y移動到右子樹的根節點;③令Y的左兒子為左子樹TL。

        



四、核心代碼實現:

    1.伸展樹的伸展實現

         ⅰ、( "一" 字形) P是G的左兒子,X是P的左兒子;

              操作:

                  G的左兒子=P的右兒子;

                  P的右兒子=G;

                  P的左兒子=X的右兒子;

                  X的右兒子=P;

//一字形(左左)

static Position ZigzigLL(Position g)
{
    Position p,x;
    p=g->left;x=p->left;
    
    g->left=p->right;
    p->right=g;
    p->left=x->right;
    x->right=p;
    
    return x;
}


ⅱ、( "一" 字形)P是G的右兒子,X是P的右兒子;

        操作:

            G的右兒子=P的左兒子;

            P的左兒子=G;

            P的右兒子=X的左兒子;

            X的左兒子=P; 

//一字形(右右)

static Position ZigzigRR(Position g)
{
    Position p,x;
    p=g->right;x=p->right;
    
    g->right=p->left;
    p->left=g;
    p->right=x->left;
    x->left=p;
    
    return x;
}

           

ⅲ、( "之" 字形)P是G的左兒子,X是P的右兒子;

        操作:

            G的左兒子=X的右兒子;

            X的右兒子=G;

            P的右兒子=X的左兒子;

            X的左兒子=P;

//一字形(左右)

static Position ZigzigLR(Position g)
{
    Position p,x;
    p=g->left;x=p->right;
    
    g->left=x->right;
    x->right=g;
    p->right=x->left;
    x->left=p;
    
    return x;
}


ⅳ、( "之" 字形)P是G的右兒子,X是P的左兒子;           

        操作:

            G的右兒子=X的左兒子;

            X的左兒子=G;

            P的左兒子=X的右兒子;

            X的右兒子=P;

//一字形(右左)

static Position ZigzigRL(Position g)
{
    Position p,x;
    p=g->right;x=p->left;
    
    g->right=x->left;
    x->left=g;
    p->left=x->right;
    x->right=p;
    
    return x;
}


    3.伸展樹的刪除操作實現

//刪除節點
void Delete(const ElementType x,const sTree st)
{
    if(NULL==st) printf("該樹為空樹\n");
    else{
        position temp=Find(x,st);
        Position root=FindMin(temp->right);
        root->left=temp->left;
        
        free(temp);
        temp=NULL;
        return ;
    }
}
向AI問一下細節

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

AI

梓潼县| 嘉善县| 镇原县| 合江县| 恭城| 巴马| 嵩明县| 内黄县| 宿松县| 阿拉善右旗| 广河县| 太仓市| 观塘区| 广州市| 佛教| 莱芜市| 买车| 虞城县| 高雄县| 磴口县| 桃江县| 祥云县| 大兴区| 游戏| 怀远县| 浠水县| 纳雍县| 民丰县| 太谷县| 托克托县| 怀仁县| 垣曲县| 东乌珠穆沁旗| 炎陵县| 莲花县| 吕梁市| 若尔盖县| 儋州市| 苏州市| 阿坝| 淮阳县|