diff --git a/a.out b/a.out index 0b6f420..9c51601 100755 Binary files a/a.out and b/a.out differ diff --git a/trees.cmi b/trees.cmi index 29e58b8..d0adebc 100644 Binary files a/trees.cmi and b/trees.cmi differ diff --git a/trees.cmo b/trees.cmo index 6fc67af..0564047 100644 Binary files a/trees.cmo and b/trees.cmo differ diff --git a/trees.ml b/trees.ml index d697c4e..c9cd94b 100644 --- a/trees.ml +++ b/trees.ml @@ -251,11 +251,11 @@ let count_per_floor tr = in aux tr 0 ; res ;; let showtree tdt r = - let rec aux t = match t with + let rec aux t side = match t with | Nothing -> () | Tail data -> begin set_line_width 9; - set_color (rgb 48 48 48); + if side = 1 then set_color (rgb 200 48 48) else set_color (rgb 48 48 200) ; draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; set_color (rgb 192 192 192); @@ -271,11 +271,11 @@ let showtree tdt r = end | Cross (data, g, d) -> begin set_line_width 9; - set_color (rgb 48 48 48); + if side = 1 then set_color (rgb 200 48 48) else set_color (rgb 48 48 200) ; draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; - aux g; - aux d; + aux g (-1); + aux d 1; set_color (rgb 192 192 192); fill_circle data.self.x data.self.y r; @@ -288,7 +288,7 @@ let showtree tdt r = set_line_width 5; draw_integer data.self.x data.self.y data.tag r; end - in aux tdt ;; + in aux tdt 0 ;; let coords_on_segment a b divsize k = if divsize <> 0 then @@ -301,8 +301,6 @@ let max_of_arr a = if !m < a.(i) then m := a.(i) done; !m ;; - - let pretty_tree_printing_new_version tr r ystep win_w win_h display = let d = depth_of_tree tr in let amt_per_floor = count_per_floor tr in @@ -326,20 +324,64 @@ let pretty_tree_printing_new_version tr r ystep win_w win_h display = visited_fl.(dpth) <- visited_fl.(dpth) + 1; if dpth <> 0 then begin let data = {tag = x ; parent = parent_xy ; self = self} in - Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + let arg_left = build_data_tree g (dpth+1) self in + let arg_right = build_data_tree d (dpth+1) self in + (* PS : this is a good example of OCaml evaluating its arguments from right to left *) + (* if the recursive call were to be directly inside the constructor, the displayed tree would be reversed *) + Cross (data, arg_left, arg_right) end else begin let data = {tag = x ; parent = self ; self = self} in - Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + let arg_left = build_data_tree g (dpth+1) self in + let arg_right = build_data_tree d (dpth+1) self in + Cross (data, arg_left, arg_right) end end in let treedata = build_data_tree tr 0 {x = win_w/2 ; y = win_h - r} in - if display then showtree treedata r ;; + if display then showtree treedata r; treedata ;; + +(* ABR things *) + +let identity n = n ;; + +let rec insert_abr tr e = match tr with + | Empty -> Node (e, Empty, Empty) + | Leaf t when e < t -> Node (t, (Node (e, Empty, Empty)), Empty) + | Leaf t -> Node (t, Empty, (Node (e, Empty, Empty))) + | Node (x, g, d) when e < x -> Node (x, insert_abr g e, d) + | Node (x, g, d) -> Node (x, g, insert_abr d e) ;; + +let successive_insert () = + let cur_tree = ref (Empty) in + open_graph " 1400x1000" ; + set_window_title "Trees" ; + try + while true do + Stdlib.print_endline "What element would you like to insert ? (crash to terminate)"; + let elt = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in + + close_graph () ; + open_graph " 1200x1000" ; + set_window_title "Trees" ; + + cur_tree := insert_abr !cur_tree elt; + ignore (pretty_tree_printing_new_version !cur_tree 40 100 1200 1000 true) + done; + () + with + | Stdlib.Scanf.Scan_failure _ -> ignore (pretty_tree_printing_new_version !cur_tree 40 150 1200 1000 true) ;close_graph () ;; (* --------------------------------------| TESTS |-------------------------------------- *) Random.self_init () ;; - -let identity n = n ;; +(* +open_graph " 1800x1000" ;; +set_window_title "Trees" ;; +ignore (pretty_tree_printing_new_version (Node (0, Node (1, (Node (0, Node (1, Empty, Empty), Node (2, Empty, Empty))), Empty), Node (2, Empty, (Node (0, Node (1, Empty, Empty), Node (2, Empty, Empty)))))) 40 150 1800 1000 true) ;; +ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; +close_graph () ;; +failwith "E" ;; +*) +successive_insert () ;; open_graph " 1800x1000" ;; set_window_title "Trees" ;;