1. 程式人生 > >二叉排序樹的刪除操作

二叉排序樹的刪除操作

在二叉排序樹中刪除一個節點,首先查詢該節點,若存在,則刪除之。設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