二叉排序樹的刪除詳細解剖

前言

網上的很多博客稂莠不齊,講的也是參差不齊。我看了百度排名靠前的幾篇博客,大概都存在沒有把各種情況分析完全的問題,雖然有代碼,但還是看的不明不白。

於是我就參考了黑皮書《算法導論(第三版)》做個筆記。同時,對比了與國內教材的不同。

這裏只講二叉排序樹的刪除。

二叉排序樹的刪除

二叉排序樹,又稱爲二叉搜索樹,設爲 T ,刪除結點 z 可分爲三種大情況:

  • z 爲葉子結點,直接刪除。類似下圖:

    img

  • z 只有左孩子或者右孩子,直接刪掉,讓其孩子代替。類似下圖:

    img

  • z 同時擁有左孩子和右孩子,那麼就要找到 z 的直接後繼 y (相對於中序遍歷),y 肯定在 z 的右子樹中,並且沒有左孩子(中序遍歷的特點)。根據 y 又分兩種情況:

    • y 直接是 z 的右孩子,並且 y 無左孩子 ,直接將後繼結點 y 頂替 z。類似下圖:

    • 否則的話,y 位於 z 的右子樹,但是不是右孩子。先用 y 的右孩子 x 代替 y,然後再用 y 頂替 z(可能就這稍微複雜一點)。類似下圖:

後序

有趣的是,我在參考 黑皮書《算法導論(第三版)》 的同時,也看了 黑皮書《數據結構與算法分析(Java語言描述)(第三版)》,這兩本教材對二叉排序樹的第三種刪除方式是一樣的,只考慮刪除結點 z 的直接後繼結點。

國內的話,科班出身一般都是從 清華大學嚴蔚敏老師的《數據結構(C語言版)》 學習到這部分。嚴老師對於二叉排序樹的第三種刪除方式與上述有些差異,主要是考慮了 刪除結點 z 的直接前驅結點,國內很多博客也都是圍繞這種思路。其實兩種方法的考慮點基本是相同的,結果都是可以的。

思路:

  • z 同時擁有左孩子和右孩子,那麼就要找到 z 的直接前驅 y (相對於中序遍歷),y 肯定在 z 的左子樹中(中序遍歷的特點)。根據 y 又分兩種情況:
    • y 沒有右孩子,直接將 y 頂替 z,y 的左孩子頂替 y。
    • y 有右孩子 x,直接將 x 頂替 z。

這種方法是嚴老師在書中介紹的第二種方法,還有第一種方法就不再提了,不太常見,感興趣可以去書中看看。

後續實現代碼版。

更多精彩文章見這裏 >>我的學習小站<<
更多好玩見這裏 >>技術雜談<<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章