Functional programming 如何避免在插入BST时复制/创建新节点
让我们暂时忽略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,
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测试。只是持续的小减速。你可以从搜索的底部抛出异常,传回额外的状态,等等。我盯着这个问题看了一个多小时,才在堆栈溢出上看到“存在”这个词:/噢,天哪,我也花了很多时间试图弄清楚这一点。完全错过了现有的元素位。