二叉平衡樹(AVL樹)

在瞭解AVL樹前,需要具備以下兩點只知識:

  1. 普通二叉樹 2. 二叉排序樹

這時,我們可以進入到平衡樹的學習中了,但在學習之前,有一個問題,何爲平衡樹?很多的參考書中說到,平衡樹就是每一個節點的平衡因子的值只能爲0,±1。那麼平衡因子又是什麼?平衡因子,是左右子樹節點個數的差。(這樣就容易理解了吧!(⊙﹏⊙))
這裏涉及到了平衡樹的插入操作,那麼該如何對於每一個插入的數進行操作處理呢?這裏的分類討論分爲4種情況(強烈建議大家自己手寫一遍):
1.LL型操作:
情況:這是在某個節點的左孩子的左子樹上插入節點導致平衡樹不平衡。
調整方法:

void LL(tree &bt){
    tree q=bt,p=bt->l->r;//bt表示根節點
    bt=bt->l;//指針修改 
    bt->r=q;
    bt->r->l=p;//3次 
    //這裏要自行領會!!!
    bt->r->high=max(hig(bt->r->l),hig(bt->r->r))+1;
    bt->high=max(hig(bt->l),hig(bt->r))+1;
}

2.RR型操作:
情況:這是在某個節點的右孩子的右子樹上插入節點導致平衡樹不平衡
調整方法:

void RR(tree &bt){
    tree q=bt,p=bt->r->l;
    bt=bt->r;//指針修改 
    bt->l=q;
    bt->l->r=p;//3次 
    bt->l->high=max(hig(bt->r->l),hig(bt->r->r))+1;
    bt->high=max(hig(bt->l),hig(bt->r))+1;
}

3.LR型操作:
情況:這是在某個節點的左孩子的右子樹上插入節點導致平衡樹不平衡
調整方法:

void LR(tree &bt){
    tree q=bt,m=bt->l->r->l,p=bt->l->r->r;
    bt=bt->l->r;
    bt->l=q->l;
    bt->l->r=m;
    bt->r=q;
    bt->r->l=p; 
    bt->l->high=max(hig(bt->l->l),hig(bt->l->r))+1;
    bt->r->high=max(hig(bt->r->l),hig(bt->r->r))+1;
    bt->high=max(hig(bt->l),hig(bt->r))+1;
}

4.RL型操作:
情況:在某個節點的右孩子的左子樹上插入節點導致平衡樹不平衡
調整方法:

void RL(tree &bt){
    tree q=bt,m=bt->r->l->r,p=bt->r->l->l,pp=bt;
    bt=bt->r->l;
    bt->r=q->r;
    bt->r->l=m;
    bt->l=q;
    bt->l->r=p; 
    bt->l->high=max(hig(bt->l->l),hig(bt->l->r))+1;
    bt->r->high=max(hig(bt->r->l),hig(bt->r->r))+1;
    bt->high=max(hig(bt->l),hig(bt->r))+1;
} 

這些代碼只是平衡樹的一部分(插入),如果想要了解刪除,請持續關注我的博客

發佈了112 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章