Advertisement
rooq37

lab8pp

Nov 28th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. let rec ltake = function
  2. | (0, _) -> []
  3. | (_,LNil) -> []
  4. | (n,LCons(x,xf)) -> x::ltake(n-1, xf())
  5.  
  6. let rec (@$) ll1 ll2 =
  7. match ll1 with
  8. | LNil -> ll2
  9. | LCons(x,xf) -> LCons(x,function() -> (xf()) @$ ll2);;
  10.  
  11. type llist = LNil | LCons of int * (unit -> llist);;
  12.  
  13. module Tree =
  14. struct
  15. type 'a t = Tip | Node of 'a * 'a t * 'a t
  16.  
  17. let create = Tip;;
  18.  
  19. let rec insert tree (value) =
  20. match tree with
  21. | Tip -> Node(value, Tip, Tip)
  22. | Node(info,t1,t2) ->
  23. if(value<=info) then Node(info,insert t1(value),t2)
  24. else Node(info,t1,insert t2(value)
  25. )
  26. ;;
  27.  
  28. let rec find tree (key) =
  29. match tree with
  30. | Node(value,t1,t2) ->
  31. if(key = value) then true
  32. else (if key<value then find t1 (key) else find t2 (key))
  33. | Tip -> false
  34. ;;
  35.  
  36. let rec getPreOrder tree =
  37. match tree with
  38. | Tip -> []
  39. | Node(value,t1,t2) -> value::getPreOrder t1@getPreOrder t2
  40. ;;
  41.  
  42. let rec getPostOrder tree =
  43. match tree with
  44. | Tip -> []
  45. | Node(value,t1,t2) -> List.rev(value::List.rev(getPostOrder t1@getPostOrder t2))
  46. ;;
  47.  
  48. let rec getInOrder tree =
  49. match tree with
  50. | Tip -> []
  51. | Node(value,t1,t2) -> getInOrder t1@(value::getInOrder t2)
  52. ;;
  53.  
  54. let rec getPreOrderL tree =
  55. match tree with
  56. | Tip -> LNil
  57. | Node(value,t1,t2) -> LCons(value, function() -> getPreOrderL t1@$getPreOrderL t2)
  58. ;;
  59.  
  60. let rec getPostOrderL tree =
  61. match tree with
  62. | Tip -> LNil
  63. | Node(value,t1,t2) -> List.rev(value::List.rev(getPostOrder t1@getPostOrder t2))
  64. ;;
  65.  
  66. let rec deletemin tree =
  67. match tree with
  68. Node(value,Tip,t2) -> (value,t2)
  69. | Node(value,t1,t2) ->
  70. let (value,l) = deletemin t1
  71. in (value,Node(value,l,t2))
  72. | Tip -> failwith "error"
  73. ;;
  74.  
  75. let rec delete tree key =
  76. match tree with
  77. Tip -> Tip
  78. | Node(value,t1,t2) ->
  79. if(key > value) then Node(value, delete t1 key, t2)
  80. else if(key = value) then
  81. ( match (t1, t2) with
  82. (Tip, t2) -> t2
  83. | (t1, Tip) -> t1
  84. | _ -> let (value,t_right) = deletemin t2 in Node(value,t1,t_right)
  85. )
  86. else Node(value, t1, delete t2 key)
  87. ;;
  88.  
  89.  
  90. end;;
  91.  
  92. let s1 = let open Tree in create;;
  93. let s2 = Tree.insert s1 (5)
  94. let s3 = Tree.insert s2 (3)
  95. let s4 = Tree.insert s3 (1)
  96. let s5 = Tree.insert s4 (4)
  97. let s6 = Tree.insert s5 (7)
  98.  
  99. ltake(10,Tree.getPreOrderL s6)
  100. Tree.getPostOrder s6
  101. Tree.getInOrder s6
  102. Tree.find s3 (3)
  103. let s7 = Tree.delete s6 5
  104. Tree.getPreOrder s7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement