Functional programming 如何避免在插入BST时复制/创建新节点

Functional programming 如何避免在插入BST时复制/创建新节点,functional-programming,ocaml,binary-search-tree,sml,Functional Programming,Ocaml,Binary Search Tree,Sml,让我们暂时忽略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,

让我们暂时忽略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)
让rec插入x=函数
|叶->节点(叶,x,叶)
|节点(l、k、r)作为n->
如果x=k,则n
如果x
毫无疑问,函数
insert
沿搜索路径创建新节点/复制节点

所以我的问题是,有没有办法避免这种复制?

这个问题来自本书的练习2.3:

练习2.3将现有元素插入二叉搜索树 复制整个搜索路径,即使复制的节点是 与原件无法区分。使用异常重写插入 以避免这种复制。每次插入仅建立一个处理程序,而不是 每个迭代都有多个处理程序

实际上,我不太明白这个练习

  • “使用异常来避免这种复制”是什么意思
  • 为什么要使用“例外”
  • “每次插入一个处理程序”是什么意思

  • 请注意,只有在插入已存在的元素时,才能避免复制!看看怎么做应该不会太难。

    啊,好吧,我想这完全可以避免。等等,你确定吗?我应该在真正插入之前做一个
    mem
    测试吗?如果你读了你复制的文本,它会说“将现有元素插入到二元搜索树中…”(我的重点)。当然,你可以做mem测试。只是持续的小减速。你可以从搜索的底部抛出异常,传回额外的状态,等等。我盯着这个问题看了一个多小时,才在堆栈溢出上看到“存在”这个词:/噢,天哪,我也花了很多时间试图弄清楚这一点。完全错过了现有的元素位。