在瞭解AVL樹前,需要具備以下兩點只知識:
這時,我們可以進入到平衡樹的學習中了,但在學習之前,有一個問題,何爲平衡樹?很多的參考書中說到,平衡樹就是每一個節點的平衡因子的值只能爲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;
}
這些代碼只是平衡樹的一部分(插入),如果想要了解刪除,請持續關注我的博客