標籤:一半 刪除演算法 沒有 問題 所有結點 串連 相等 結果 為什麼
一.二叉排序樹產生原因
為什麼要有二叉排序樹這種資料結構的產生?對於一個既要排序、又要支援高效的尋找、插入和刪除操作的資料元素集合,將其組織成一個什麼樣的資料結構能夠滿足要求?我們對於排序次序表、排序單鏈表和散列表這幾種資料結構進行分析:
(1)排序次序表,可以採用折半尋找法,時間效率為O(log2n);插入和刪除的操作時間複雜度為O(n),資料移動量大,效率較低。
(2)排序單鏈表,順序尋找的時間效率為O(n),不能採用折半尋找演算法;插入和刪除操作的時間複雜度為O(n),雖然沒有資料移動但因為查詢找效率低下,使得插入和刪除的效率也較低。
(3)散列表,雖然尋找、插入和刪除操作的效率較高,但是散列表不具有排序特性。
上述幾種資料結構不能滿足問題的要求。我們一樹結構來研究這個問題。
二叉排序樹是一種既支援排序、又支援高效的尋找、插入和刪除操作的資料群組織方案,她的尋找等操作效率可達到O(log2n)。
在一棵二叉樹中尋找一個節點,需要在遍曆二叉樹的過程中對節點逐個進行比較,這是順序尋找演算法,尋找效率為O(n)。如果一顆二叉樹是排序的,則沒經過一次比較,根據比較結果,可在當前節點的左子樹和右子樹中選擇其一繼續,從而將尋找範圍縮小了一半, 一次尋找只需要經過從根到某節點的一條路徑就可獲得尋找結果,比較次數最多是二叉樹的高度,尋找效率為O(log2n)。遠低於O(n).
二、二叉排序樹的定義
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹;
(1)每個結點都有一個作為尋找一句的關鍵字,所有結點的關鍵字互不相同。
(2)若一個結點的左子樹不空,則左子樹上所有結點的關鍵字均小於這個結點的關鍵字;若一個結點的右子樹不為空白,則右子樹上所有結點的關鍵字均大於這個結點的關鍵字。
(3)每個結點的左、右子樹也分別為二叉排序樹。
一個二叉排序樹中序遍曆得到的關鍵字是升序的。
三、二叉樹的尋找
在一棵二叉排序樹中,尋找關鍵字key元素結點,演算法描述如下:
(1)從根節點開始,設p指向根節點
(2)將p結點的關鍵字與key比較,若兩者相等,則尋找成功;若key較小,則在p的左子樹中繼續尋找;若key較大,則在p的右子樹中繼續尋找。
(3)重複執行上一步,直到尋找成功或p為空白。若p為空白,則尋找不成功。
四、二叉排序樹的插入
一棵二叉排序樹,插入一個結點之後必須仍然是二叉排序樹。每插入一個結點,首先需要找到該結點在二叉排序樹中的插入位置,若具有相同關鍵字的結點已經在二叉排序樹中,則不插入;否則將新結點作為椰子結點串連在其尋找不成功的一條路徑之尾,
該路徑從根結點到某個原葉子結點。因此,給定一棵二叉樹,一個結點的插入位置是唯一的。
五、二叉排序樹的刪除
在二拆排序樹中刪除一個結點,首先尋找該節點,若存在,則根據結點的度對二叉排序樹進行不同程度的調整,使刪除結點後的二叉樹仍然是二叉排序樹。
設p指向待刪除的結點,parent指向p的父結點。根據p的維度不同,二叉排序樹的刪除演算法分以下三種演算法。
(1)p是葉子結點。若p是parent的左孩子,刪除p結點並設定parent的left鏈為空白;若p是右孩子,刪除p結點並設定parent的right鏈為空白。
(2)p是1度結點,刪除p結點並用p的孩子填補作為parent的孩子,共有四中情況。
a.若p是parent的左孩子且p有左孩子,設定parent的left鏈指向p的左孩子。
b.若p是parent的左孩子且p有右孩子,設定parent的left鏈指向p的右孩子。
c.若p是parent的右孩子且p有左孩子,設定parent的right鏈指向p的左孩子。
d.若p是parent的右孩子且p有右孩子,設定parent的right鏈指向p的右孩子。
(3)p是2度結點,不直接刪除p結點,而是先用p的中根次序下的後繼空額到嗎insucc值代替p結點值,再刪除insucc結點。這樣將刪除2度結點問題轉換為刪除1度結點或葉子結點,使得對二叉排序樹的調整減少到最小程度。
二叉排序樹