1
我正在OCaml中构建binary search tree
的操作。删除OCaml中的二进制搜索树
type ('a, 'b) bst =
| Node of 'a * 'b * ('a, 'b) bst * ('a, 'b) bst
| Leaf;;
let rec insert k v = function
| Leaf -> Node (k, v, Leaf, Leaf)
| Node (k', v', left, right) ->
if k < k' then Node (k', v', insert k v left, right)
else if k = k' then Node (k, v, left, right)
else Node (k', v', left, insert k v right);;
let rec delete k = function
| Leaf -> Leaf
| Node (k', v, l, r) as p ->
if k < k' then Node (k', v, (delete k l),r)
else if k > k' then Node (k', v, l, (delete k r))
else
match (l, r) with
| (Leaf, Leaf) -> Leaf
| (l, Leaf) -> l
| (Leaf, r) -> r
| (_, _) ->
let Node (km, vm, _, _) = max l in
Node (km, vm, delete km l, Leaf)
谁能告诉我,我的代码是否足够或改善好?
我想在我的情况下,如果删除找不到密钥,那么同样的树会被返回,不是吗? – 2013-03-11 17:33:34
编号我在上面正确地描述了删除。它在结构上是同一棵树,但不是在物理上。这些递归调用每次调用重新构造一个新的'Node'。您可以将其视为准备一个新节点,假设我们要删除左侧子树(或右侧)上的某些内容。当然这个假设不是真的,我们最终得到一个'Leaf',它返回一个'Leaf',但是在没有任何东西被删除的时候,没有办法解开旧路径。 – nlucaroni 2013-03-11 18:06:18
ahh,好的,谢谢 – 2013-03-11 18:09:45