1. 程式人生 > >二叉搜索樹的刪除操作詳解(BST)

二叉搜索樹的刪除操作詳解(BST)

子節點 沒有 解釋 找到 bst 左右 直接 元素 改變

一、思想:分類討論

二、二叉搜索樹的刪除操作具體討論分如下四種情況:(記我們要刪除的節點為D

1、如果D節點既沒有左孩子,也沒有右孩子,那麽直接刪除就好了;

2、如果D節點只有左孩子,沒有右孩子,那麽只需要把該D節點左孩子鏈接到D節點的父親節點,然後刪除D節點就好了;

3、如果D節點只有右孩子,沒有左孩子,那麽只需要把該D節點右孩子鏈接到D節點的父親節點,然後刪除D節點就好了;

4、如果D節點既有左孩子,又有右孩子,那麽需要找到D節點的右子樹的最小值節點,找到之後直接替換掉D節點,然後刪除找到的最小值節點就好了。(解釋:因為D節點有左右兩個孩子節點,很顯然D節點的左子樹中的所有節點值都小於D節點的值,D節點的右子樹中的所有節點的值都大於D節點的值,這個是根據二叉搜索樹的定義得到的結論。那麽現在D要被刪除,那麽D被刪除之後誰可以來替換它的位置呢?顯然只能是D的右子樹的最小值可以勝任,因為它既滿足大於D節點的左子樹中的所有節點值,因為D的右子樹的所有節點值都大於D的左子樹的節點值;同時也滿足小於D的右子樹中所有的其他節點值,因為D是右子樹中最小的值,當然小於D的右子樹中所有其他節點值了)

三、圖例說明:

1、第一種情況:這種情況其實就是葉子節點的刪除,反正它絕代了,刪除了就刪除了,多他不多,少它不少。比如刪除下圖中的21號元素,它既沒有左孩子,也沒有右孩子,直接將其父節點指向它的鏈接刪除就行了。

技術分享圖片

2、第二種情況:刪除10號節點,該節點只有左孩子,沒有右孩子。只需要三步即可,刪除10號節點指向其5號左子樹的鏈接,刪除10號節點的父節點15號指向她的鏈接,將10號節點的父節點15號的左鏈接指向10號的5號左子樹。

技術分享圖片

3、第三種情況:刪除40號節點,該節點只有右孩子,沒有左孩子。只需要三步即可,刪除40號節點指向其50號右子樹的鏈接,刪除40號節點的父節點30號指向她的鏈接,將40號節點的父節點30號的右鏈接指向40號的50號右子樹。

技術分享圖片

2、第四種情況:刪除20號節點,因為他既有左孩子,又有右孩子。所以先找到20號節點的右子樹中所有節點中的最小值為21號,其實右子樹的最小值就是在右子樹的最左邊的那個節點;找到替換節點21號後就可以進行下一步操作了,如下圖,20號需的父節點指向的鏈接改變為指向21號,20的左右孩子鏈接也需要替換,21號原來的父節點指向需要刪除。

技術分享圖片

二叉搜索樹的刪除操作詳解(BST)