现在让我们忽略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插入二叉搜索树 即使复制的节点是,也复制整个搜索路径 与原件无法区分。使用异常重写插入 避免这种复制。每次插入只建立一个处理程序 每次迭代不止一个处理程序。
我实际上并不遵循这个练习。
答案 0 :(得分:1)
请注意,只有在插入已经存在的元素时才能避免复制!不应该太难看出如何做到这一点。