47 lines
1.0 KiB
OCaml
47 lines
1.0 KiB
OCaml
(** rank of node = shortest distance to a leaf (empty node)
|
|
* hence, rank of node = 1 + min(rnak of left, rank of right)
|
|
* leftist tree has 2 properties:
|
|
* For ever node
|
|
* * leftist: rnak(left) >= rank(right)
|
|
* * min-heap: value(parent) <= value(node)
|
|
*)
|
|
|
|
type 'a t = L | N of int * 'a * 'a t * 'a t;;
|
|
|
|
exception Empty;;
|
|
|
|
let rank = function
|
|
| L -> 0
|
|
| N (rk, _, _, _) -> rk;;
|
|
|
|
let empty = L;;
|
|
|
|
let is_empty t = t = L;;
|
|
|
|
let rec merge t1 t2 =
|
|
match t1, t2 with
|
|
| t, L | L, t -> t
|
|
| N (_, x1, _, _), N (_, x2, _, _) when x2 < x1 ->
|
|
merge t2 t1
|
|
| N (_, x, l, r), t ->
|
|
let t' = merge r t in
|
|
if rank t' > rank l then N (1 + rank l, x, t', l)
|
|
else N (1 + rank t', x, l, t');;
|
|
|
|
let insert x t =
|
|
merge t (N (1, x, L, L));;
|
|
|
|
let of_list l = List.fold_left (Fun.flip insert) L l;;
|
|
|
|
let get_min = function
|
|
| L -> raise Empty
|
|
| N (_, x, _, _) -> x;;
|
|
|
|
let delete_min = function
|
|
| L -> L
|
|
| N (_, _, l, r) -> merge l r;;
|
|
|
|
let rec to_list t =
|
|
if is_empty t then []
|
|
else get_min t :: to_list (delete_min t);;
|