二叉排序樹的刪除操作
在二叉排序樹中刪除一個節點,首先查詢該節點,若存在,則刪除之。設p指向待刪除節點,根據p結點的度不同,二叉排序樹的刪除演算法分一下情況,如圖所示。
中跟次序:6,12,18,44,36,54,57,60,76,81,99
(1) p是葉子結點
若p是父母的左右孩子,設定p.parent結點的left/right為空,即刪除p結點。
(2)p是1度結點
刪除p結點並用p的孩子頂替作為其父母孩子,分以下情況:
<1>若p是父母的左孩子,且p只有左孩子,則設定p.parent.left指向p的左孩子,包含p是葉子。
<2>若p是父母的有孩子,且p只有右孩子,則設定p.parent.right指向p的右孩子,包含p是葉子。
(3) p是2度結點
為了減少對二叉排序樹形態的影響,不直接刪除一個2度結點p,而是先用p在中跟次序下的後繼結點insucc值代替p結點值,再刪除insucc結點。這樣做將刪除2度結點問題轉化為刪除1度結點或葉子結點。因為,insucc是p的右子樹在中跟次序下的第一個訪問結點,若p的右孩子為葉子結點,則insucc是p的右孩子;否則insucc是p的右孩子的最左邊的一個子孫結點,insucc的度為0或1.例如,刪除2度結點54,用其後繼結點57代替其值,再刪除1度結點57.
特殊問題:(美團2016筆試)
如果當前的二叉排序樹是一個滿二叉排序樹,則該其中是沒有1度結點的,所有的刪除操作,要麼是刪除2度結點,要麼是刪除葉子結點。
如果是刪除葉子結點,則直接將該節點從中跟次序裡面刪除即可。
若果刪除的是2度結點,則由於是滿二叉樹,所以最後就轉換問刪除葉子結點,直接利用中跟次序後繼結點覆蓋刪除結點,然後刪除後繼結點即可。中跟次序其實就是將刪除的結點去掉即可。
所以總結如下:
若是滿二叉樹排序樹,刪除任何結點,反映在中跟次序裡就是直接刪除對應的結點即可,其他的不變。例如下圖
其中跟次序為:12,18,36,54,76,81,99
若是刪除54,則其中跟次序就是將54從原來的中跟次序中刪除即,12,18,36,76,81,99.
若是刪除18,則是12,36,54,76,81,99
若是刪除36,則是12,18,54,76,91,99