2013-10-28 38 views
1

現在讓我們忽略BST的平衡部分。如何避免在插入BST時複製/創建新節點

type 'a bst = 
    | Leaf 
    | Node of 'a bst * 'a * 'a bst 

典型insert看起來就像這樣:

let rec insert x = function 
    | Leaf -> Node (Leaf, x, Leaf) 
    | Node (l, k, r) as n -> 
    if x = k then n 
    else if x < k then Node (insert x l, k, r) 
    else Node (l, k, insert x r) 

毫無疑問,功能insertcreate new nodes/make a copy of nodes搜索路徑。

所以我的問題是有沒有辦法避免這種複製?

這個問題來自於書Purely Functional Data StructuresExercise 2.3

練習2.3插入現有eleemtn成二叉搜索樹 會將整個搜索路徑,即使複製節點是從原件 沒有區別。使用例外 重寫插入以避免此複製。每個插入僅建立一個處理程序,而不是每個迭代一個處理程序。

我其實不太喜歡這個練習。

  1. 什麼意思是「使用異常來避免這種複製」?
  2. 爲什麼要使用「例外」?
  3. 什麼意思是「每個插入一個處理程序」?
+0

噢,我花了很多時間來解決這個問題。完全錯過了_existing_元素位。 –

回答

1

請注意,只有在插入已經存在的元素時才能避免複製!應該不難看出如何做到這一點。

+0

啊,好的,我認爲這完全可以避免 –

+0

等等,你確定嗎?我應該在實際插入之前做一個'mem'測試嗎? –

+0

如果你閱讀你複製的文本,說「插入一個*存在*元素到一個二叉搜索樹...」(我的重點)。當然,你可以做mem測試。只是一個小的不斷放緩。你可以從搜索的底部拋出異常,回傳額外狀態等。 –