module BinomialHeap (Element : OrderedType) : (QUEUE with module Elem = Element) = struct module Elem = Element type tree = Node of int * Elem.t * tree list type t = tree list let empty = [] let is_empty ts = ts = [] let rank (Node (r, _, _)) = r let root (Node (_, x, _)) = x let link (Node (r, x1, c1) as t1) (Node (_, x2, c2) as t2) = if Elem.leq x1 x2 then Node (r + 1, x1, t2 :: c1) else Node (r + 1, x2, t1 :: c2) let rec ins_tree t = function | [] -> [t] | t' :: ts' as ts -> if rank t < rank t' then t :: ts else ins_tree (link t t') ts' let insert x ts = ins_tree (Node (0, x, [])) ts let rec merge ts1 ts2 = match ts1, ts2 with | _, [] -> ts1 | [], _ -> ts2 | t1 :: ts1', t2 :: ts2' -> if rank t1 < rank t2 then t1 :: merge ts1' ts2 else if rank t2 < rank t1 then t2 :: merge ts1 ts2' else ins_tree (link t1 t2) (merge ts1' ts2') let rec remove_min_tree = function | [] -> raise Empty | [t] -> t, [] | t :: ts -> let t', ts' = remove_min_tree ts in if Elem.leq (root t) (root t') then (t, ts) else (t', t :: ts') let find_min ts = root (fst (remove_min_tree ts)) let delete_min ts = let Node (_, x, ts1), ts2 = remove_min_tree ts in merge (List.rev ts1) ts2 end