【LeetCode & 劍指offer刷題】樹題2:二叉查詢樹的查詢、插入、刪除
阿新 • • 發佈:2019-01-05
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)
二叉查詢樹的查詢、插入、刪除
1 查詢結點 最佳情況是 O(log 2 n),而最壞情況是 O(n)- BST 的查詢是從根結點開始,若二叉樹非空,將給定值與根結點的關鍵字比較,
- 若相等,則查詢成功;
- 若不等,則比較查詢結點值與當前結點值大小,當給定值小於當前結點值時,在當前結點左子樹中查詢,否則在右子樹中查詢
- 在二叉樹中搜尋( 若插入值小於當前結點值,則在左子樹中遞迴插入,否則在右子樹中遞迴插入,直到遍歷到空結點,插入到此位置 ) (聯絡在有序陣列中二分插入一值)
- 如果結點 c 為空 ,將結點 插入 到c位置。
- 如果結點c不為空,比較結點 c 與結點 n 的值。
- 如果結點 c 的值與結點 n 的值相等,則說明使用者在試圖插入一個重複的結點。解決辦法可以是直接丟棄結點 n,或者可以丟擲異常。
- 如果結點 n 的值小於結點 c 的值,則說明結點 n 一定是在結點 c 的左子樹中。則將父結點設定為結點 c,並將結點 c 設定為結點 c 的左孩子,然後返回至第 1 步。
- 如果結點 n 的值大於結點 c 的值,則說明結點 n 一定是在結點 c 的右子樹中。則將父結點設定為結點 c,並將結點 c 設定為結點 c 的右孩子,然後返回至第 1 步
- 情況 1: 如果刪除的節點沒有右孩子,那麼就選擇它的左孩子來代替原來的節點 。二叉查詢樹的性質保證了被刪除節點的左子樹必然符合二叉查詢樹的性質。因此左子樹的值要麼都大於,要麼都小於被刪除節點的父節點的值,這取決於被刪除節點是左孩子還是右孩子。因此用被刪除節點的左子樹來替代被刪除節點,是完全符合二叉搜尋樹的性質的。
- 情況 2: 如果被刪除節點的右孩子沒有左孩子 ,那麼這個右孩子被用來替換被刪除節點。因為被刪除節點的右孩子都大於被刪除節點左子樹的所有節點,同時也大於或小於被刪除節點的父節點,這同樣取決於被刪除節點是左孩子還是右孩子。因此,用右孩子來替換被刪除節點,符合二叉查詢樹的性質。
- 情況 3: 如果被刪除節點的右孩子有左孩子 ,就需要用被刪除節點右孩子的左子樹中的最下面的節點來替換它,就是說,我們 用被刪除節點的右子樹中最小值的節點來替換 。