avl樹的删除很多教材上都沒有提供,本人對avl樹有着較為深入的研究。現在曬出大體的算法思想。
<b> 3.2</b><b>.1 </b><b>遞歸法</b>
遞歸實作avl樹的結點删除的思想如下。
在avl樹t上删除值為e的結點步驟如下:
(1) 若樹t為空,傳回0退出否則到(2);
(2) 比較t的資料和e,若相等跳到(3),若e小于t->data跳到(4),若e大于t->data則跳到(5)
(3) 分析t結點的類型
(3.1)若t是葉子結點則直接删除,樹變矮即lower=1;
(3.2)若t隻有右子樹tr則将右子樹結點的值賦給t,删除tr結點将t->rchild=null,lower=1;
(3.3)若t有左子樹,則找到其中序周遊的前驅結點p,将p結點值用臨時變量temp儲存,并且用指針tptr儲存t;遞歸删除結點p;将tptr所指結點即原t結點的值更新為temp;
(4)在左子樹t->lchild中遞歸删除值為e的結點,若删除成功檢查左子樹是否變矮即lower的值是否為1;若lower=0傳回0退出;若lower=1則進行失衡調整各種情況上文有分析
(5)在右子樹t->rchild中遞歸删除值為e的結點,若删除成功檢查左子樹是否變矮即lower的值是否為1;若lower=0傳回0退出;若lower=1則進行失衡調整,各種情況上文有分析
大家可以很容易的實作。上文提到的平衡處理情況,很多書籍都有。