Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.01 KB | None | 0 0
  1. open List
  2.  
  3. type 'a tree = Node of 'a * 'a tree * 'a tree | Null
  4.  
  5. type 'a init_last = 'a list * 'a list
  6.  
  7. let to_list (xs : 'a init_last) : 'a list =
  8. let (init, last) = xs in init @ rev last
  9.  
  10. let push_top (a : 'a) (xs : 'a init_last) : 'a init_last =
  11. let (init, last) = xs in (a :: init, last)
  12.  
  13. let push_end (xs : 'a init_last) (a : 'a) : 'a init_last =
  14. let (init, last) = xs in (init, a :: last)
  15.  
  16. let empty : 'a init_last = ([], [])
  17.  
  18. let walk t =
  19. let rec pom_walk t acc end_root =
  20. (* it's symmetric, so it could be start_root and the result would be correct too *)
  21. match t with
  22. | Null -> acc
  23. | Node (nr, l, r) ->
  24. if end_root then
  25. push_top nr (pom_walk r (pom_walk l acc false) false)
  26. else
  27. push_end (pom_walk r (pom_walk l acc true) true) nr
  28. in
  29. to_list (pom_walk t empty true)
  30.  
  31.  
  32. (* EXAMPLE *)
  33.  
  34. let node a l r = Node (a, l, r)
  35. let leaf a = node a Null Null
  36.  
  37. let example = walk (node 1 (node 2 (node 3 (leaf 4) (leaf 5)) Null) (leaf 6))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement