open Printf

type 'a bintree = Nil | T of 'a bintree * 'a * 'a bintree

let t1 = T (T(Nil, 2, Nil),
            7,
            T(T(Nil, 5, Nil), 6, T(Nil, 11, Nil)))

(* tipărește nodurile în preordine *)
let rec printpre = function
  | Nil -> ()
  | T (left, v, right) -> print_int v; print_newline();
                          printpre left; printpre right

let _ = printpre t1
      
(* numără noduri în preordine, last: ultimul nod folosit, deci de la last+1 *)
let rec countpre last = function
  | Nil -> last
  | T (left, _, right) -> let n1 = last + 1 in (* numărul pentru rădăcină *)
                          let n2 = countpre n1 left in  (* număra stânga, ajunge la n2 *)
                          countpre n2 right (* numară dreapta de la n2 *)

let _ = countpre 0 t1 |> printf "nr. de noduri: %u\n"
      
(* numără și tipărește fiecare nod cu numărul de ordine *)
let preorder = 
  let rec precnt last = function
    | Nil -> last
    | T (left, v, right) -> let n1 = last + 1 in
                            printf "nod %u valoare %d\n" n1 v;
                            let n2 = precnt n1 left in  (* parcurge stânga, ajunge la n2 *)
                            precnt n2 right (* numără dreapta pornind de la n2 *)
  in print_endline "preordine:"; precnt 0        (* 0 a fost folosit -> numără de la 1 *)

let _ = preorder t1
      
(* inordine: arbore stâng, rădăcină, arbore drept *)
let inorder = 
  let rec incnt last = function
    | Nil -> last
    | T (left, v, right) -> let n1 = incnt last left in (* parcurge stâng, ajunge la n1 *)
                            let n2 = n1 + 1 in
                            printf "nod %u valoare %d\n" n2 v;
                            incnt n2 right (* apoi dreapta pornind de la n2 *)
  in print_endline "inordine:"; incnt 0        (* 0 a fost folosit -> numără de la 1 *)
     
let _ = inorder t1
      
(* postordine: arbore stâng, arbore drept, rădăcină *)
let postorder = 
  let rec postcnt last = function
    | Nil -> last
    | T (left, v, right) -> let n1 = postcnt last left in (* parcurge stâng, ajunge la n1 *)
                            let n2 = postcnt n1 right in (* parcurge drept, ajunge la n2 *)
                            let n3 = n2 + 1 in
                            printf "nod %u valoare %d\n" n3 v; n3  (* returnează n3 *)
  in print_endline "postordine:"; postcnt 0

let _ = postorder t1
      

This document was generated using caml2html