diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2003-06-23 07:28:54 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2003-06-23 07:28:54 +0000 |
commit | d60708263ea903fa8728ba352bd245c8a94670af (patch) | |
tree | 98dd16241b4521167879204c21968ed99e27cddc /stdlib | |
parent | 38558879ccd98d30189653c84bf0dbd2f26e9469 (diff) |
Probleme d'equilibrage dans remove (PR#1720)
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5610 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/map.ml | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/stdlib/map.ml b/stdlib/map.ml index 18b910a00..26c4d23c0 100644 --- a/stdlib/map.ml +++ b/stdlib/map.ml @@ -109,12 +109,23 @@ module Make(Ord: OrderedType) = struct let c = Ord.compare x v in c = 0 || mem x (if c < 0 then l else r) - let rec merge t1 t2 = + let rec min_binding = function + Empty -> raise Not_found + | Node(Empty, x, d, r, _) -> (x, d) + | Node(l, x, d, r, _) -> min_binding l + + let rec remove_min_binding = function + Empty -> invalid_arg "Map.remove_min_elt" + | Node(Empty, x, d, r, _) -> r + | Node(l, x, d, r, _) -> bal (remove_min_binding l) x d r + + let merge t1 t2 = match (t1, t2) with (Empty, t) -> t | (t, Empty) -> t - | (Node(l1, v1, d1, r1, h1), Node(l2, v2, d2, r2, h2)) -> - bal l1 v1 d1 (bal (merge r1 l2) v2 d2 r2) + | (_, _) -> + let (x, d) = min_binding t2 in + bal t1 x d (remove_min_binding t2) let rec remove x = function Empty -> |