summaryrefslogtreecommitdiffstats
path: root/stdlib
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2003-06-23 07:28:54 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2003-06-23 07:28:54 +0000
commitd60708263ea903fa8728ba352bd245c8a94670af (patch)
tree98dd16241b4521167879204c21968ed99e27cddc /stdlib
parent38558879ccd98d30189653c84bf0dbd2f26e9469 (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.ml17
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 ->