type 'a avl = Empty | Node of int * 'a avl * 'a * 'a avl

let depth tree = 
    match tree with
        Node (d, _, _, _) -> d
      | Empty -> 0

let rec fold_dfs_aux f acc lar =
  match lar with
    [] -> acc
  | el::li -> 
     match el with
     Empty -> fold_dfs_aux f acc li
     | Node (alt,e,a,d) -> fold_dfs_aux f (f acc a) (e::d::li);;

let fold_dfs f acc ar = fold_dfs_aux f acc [ar];;

let rec fold_bfs_aux f acc lar =
  match lar with
    [] ->  acc
  | el::li -> 
     (match el with
       Empty -> fold_bfs_aux f acc li
     | Node (alt,e,a,d) -> (fold_bfs_aux f (f acc a) (li@[e;d])));;

let fold_bfs f acc ar = fold_bfs_aux f acc [ar];;

(*

                  1
           5            10
        7            15    11

*)
let ex = 
  Node (0,
        (Node(0,
              (Node(0,Empty,7,Empty)),
              5,
              (Empty))),
        1,
        ((Node(0,Node(0,Empty,15,Empty),
               10,
               (Node(0,(Empty),11,(Empty)))))));;


let () = (fold_bfs (fun a el -> (Printf.printf "%d\n" el); flush stdout) () ex)

let () = (fold_dfs (fun a el -> (Printf.printf "%d\n" el); flush stdout) () ex)


This document was generated using caml2html