真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

AVL樹之旋轉(zhuǎn)-創(chuàng)新互聯(lián)

1、AVL樹

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)漢南,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

 AVL樹首先是一顆二叉搜索樹,滿足其所有性質(zhì),AVL樹又叫做高度平衡的二叉搜索樹;

 AVL: 動態(tài)搜索樹;

 平衡因子bf: 右樹高度 — 左樹高度; bf的取值只能是1, 0, -1;

 左右子樹都得符合平衡因子, 若不符, 的通過旋轉(zhuǎn)來調(diào)整平衡因子;

2、四種旋轉(zhuǎn)

 (1)、單旋轉(zhuǎn)---->直線型

AVL樹之旋轉(zhuǎn)

 (2)、雙旋轉(zhuǎn)----->折線型

 要進行兩次旋轉(zhuǎn)的調(diào)整,判斷折線,看哪邊突出(就是三個結(jié)點中有一個突出的方向),就先向哪邊旋轉(zhuǎn);

AVL樹之旋轉(zhuǎn)

 四種旋轉(zhuǎn),每次就只針對兩個結(jié)點(要進行旋轉(zhuǎn)的2個結(jié)點);然后將上面的分支掛到旋轉(zhuǎn)后的L/R上即可。

3、畫平衡樹

 根據(jù)一組數(shù)字,畫出其AVL樹:16 3 7 11 9 26 18 14 15

 畫AVL樹,首先其實是一顆搜索二叉樹; 按照其比左孩子大,比右孩子小畫就行; 有了平衡因子,不滿足時在旋轉(zhuǎn)調(diào)整即可。

 畫法如下:

AVL樹之旋轉(zhuǎn)

AVL樹之旋轉(zhuǎn)

AVL樹之旋轉(zhuǎn)

4、四種旋轉(zhuǎn)的實現(xiàn)

 永遠只考慮三層以內(nèi)結(jié)點的旋轉(zhuǎn);

 C++實現(xiàn)其所有代碼:

 (1)、右單旋

AVL樹之旋轉(zhuǎn)

 代碼如下(代碼中ptr代表的是要bf不為平衡處,指向要進行旋轉(zhuǎn)的結(jié)點):

void RotateR(AVLNode *&ptr){
        AVLNode *subR = ptr;
        ptr = ptr->leftChild;  //通過引用直接修改指向1的指針(可能是上一個的左孩子/右孩子)
        subR->leftChild = ptr->rightChild;
        ptr->rightChild = subR;
        ptr->bf = subR->bf = 0;
    }

 (2)、左單旋

 左單旋與右單旋的代碼是鏡像的,并且想法是一致的; 所以代碼如下:

void RotateL(AVLNode *&ptr){
    AVLNode *subL = ptr;
    ptr = subL->rightChild;  //同樣是經(jīng)過引用修改
    subL->rightChild = ptr->leftChild;
    ptr->leftChild = subL;
    subL->bf = ptr->bf = 0;
}

 在進行單旋轉(zhuǎn)時,因為是在插入,其自身的bf不用調(diào)整,初始化為0;修改的是根和另一個結(jié)點的bf;

 (3)、先左后右單旋

 在進行雙旋轉(zhuǎn)時,首先明確左/右孩子,根結(jié)點的最終情況, 在進行調(diào)整;并且在雙旋轉(zhuǎn)時每個結(jié)點的bf都得改變;

AVL樹之旋轉(zhuǎn)

 平衡因子在這不好考慮,有點復(fù)雜,具體分析如下:

 平衡因子的考慮關(guān)鍵在:ptr有左樹/右樹,對應(yīng)上去則subL/sunR原先必有一個分支結(jié)點; ptr沒有孩子結(jié)點,對應(yīng)subR/subL原先也沒有分支結(jié)點;

AVL樹之旋轉(zhuǎn)

AVL樹之旋轉(zhuǎn)

 代碼如下:

void RotateLR(AVLNode *&ptr){
    AVLNode *subR = ptr;    //最終右孩子
    AVLNode *subL = ptr->leftChild; //最終左孩子
    ptr = subL->rightChild;  //最終根節(jié)點,因為引用,最終這個修改了指向根結(jié)點,完成了連接;

    subL->rightChild = ptr->leftChild;
    ptr->leftChild = subL;
    if(ptr->bf <= 0){
        subL->bf = 0;  //此時的情況就是,自己ptr原先沒有掛結(jié)點或者是左樹掛上結(jié)點,而滿足這種情況下,sunL原先必有左樹,此時在掛上右樹,所以為0;
    }else{
        subL->bf = -1;  //此時的情況是ptr有右孩子,而sunL有左孩子,滿足這種情況,所以bf只能是-1;
    }

    subR->leftChild = ptr->rightChild;
    ptr->rightChild = subR;
    if(ptr->bf == -1){  //當(dāng)結(jié)點ptr其只有左孩子時,
        subR->bf = 1;  //sunR必定有右孩子,所以此時為1
    }else{
        subR->bf = 0; //當(dāng)ptr沒有孩子結(jié)點或有一個右孩子時(此時subR必有右樹),所以此時為0;
    }

    ptr->bf = 0;   //調(diào)整后根的bf永遠是0;
}

 (4)、先右后左單旋

 與上一個雙旋的代碼是鏡像的, 并且想法是一致的; 平衡因子的修改有點不一樣,注意一下就行, 所以代碼如下:

void RotateRL(AVLNode *&ptr){
    AVLNode *subL = ptr;
    AVLNode *subR = ptr->rightChild;
    ptr = subR->leftChild;

    subR->leftChild = ptr->rightChild;
    ptr->rightChild = subR;
    if(ptr->bf >=0){
        subR->bf = 0;
    }else{
        subR->bf = 1;
    }

    subL->rightChild = ptr->leftChild;
    ptr->leftChild = subL;
    if(ptr->bf == 1){
        subL->bf = -1;
    }else{
        subL->bf = 0;
    }

    ptr->bf = 0;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)站名稱:AVL樹之旋轉(zhuǎn)-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://weahome.cn/article/posgp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部