現在讓我們忽略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)
毫無疑問,功能insert
將create new nodes/make a copy of nodes
搜索路徑。
所以我的問題是有沒有辦法避免這種複製?
這個問題來自於書Purely Functional Data Structures的Exercise 2.3
:
練習2.3插入現有eleemtn成二叉搜索樹 會將整個搜索路徑,即使複製節點是從原件 沒有區別。使用例外 重寫插入以避免此複製。每個插入僅建立一個處理程序,而不是每個迭代一個處理程序。
我其實不太喜歡這個練習。
- 什麼意思是「使用異常來避免這種複製」?
- 爲什麼要使用「例外」?
- 什麼意思是「每個插入一個處理程序」?
噢,我花了很多時間來解決這個問題。完全錯過了_existing_元素位。 –