中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

《樹》之伸展樹

發布時間: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

玛纳斯县| 台前县| 东至县| 个旧市| 惠水县| 屏东县| 南开区| 吉木萨尔县| 宽城| 洛川县| 渑池县| 娱乐| 商丘市| 循化| 宁南县| 井冈山市| 叙永县| 伊金霍洛旗| 镇坪县| 收藏| 唐河县| 益阳市| 同德县| 宁城县| 洛宁县| 长岛县| 镇康县| 永登县| 宁河县| 剑川县| 巴南区| 鸡东县| 临西县| 高陵县| 南宁市| 乐平市| 罗源县| 安平县| 汕尾市| 栾城县| 湖北省|