二叉查詢樹中的刪除
阿新 • • 發佈:2018-11-10
- 刪除
將一個結點從二叉查詢樹中刪除之後,剩下的結點可能會不滿足二叉查詢樹的性質,因此,在刪除結點之後要對樹進行調整,使其滿足二叉查詢樹的性質。根據結點的孩子的數量,將刪除操作分為三種情況,我們記要刪除的結點為z,實際上刪除的結點為y。
1. z結點沒有孩子。
如下圖a所示,我們要刪除值為13的結點,因為結點沒有孩子,所以刪除之後不會影響到二叉樹的整體性質,也就是說,直接將13這個結點刪除即可,如圖a所示,從左邊的二叉樹刪除13這個點之後變到右邊的二叉樹。
2. z結點有一個孩子。
如下圖b所示,要刪除的值為16的結點有一個孩子,而且是右孩子,那麼從圖上來看,如果,我們將16去掉,然後把以20為結點的子樹作為15的右子樹,那麼整棵樹還是符合二叉查詢樹的性質的,因此,有一個孩子的結點的刪除操作,就是要將其孩子作為其父結點的孩子即可。如圖b所示。
3. z結點有兩個孩子。
如下圖c所示,要刪除的值為5的結點,有兩個孩子,刪除之後肯定整棵樹就不符合二叉查詢樹的性質了,因此要進行調整,我們發現,將5的後繼,值為6的結點來放到5的位置,然後將6的孩子7作為6的父結點10的孩子,如下圖c所示,我們要刪除的是z結點,而我們實際要刪除y結點,並替換z結點。這裡需要注意的一點是,如果一個結點有右孩子,則該結點的後繼,至多有一個子女,而且是右孩子。因為假如該結點的後繼有左孩子和右孩子,那麼其左孩子的值肯定是介於該結點和其後繼之間的,那麼按照二叉查詢樹的性質,這個左孩子就應該是該結點的後繼,所以,這與原先的後繼相互矛盾,因此,結論成立。