Dynamic ABR insert

This commit is contained in:
Alexandre 2024-06-06 22:56:03 +02:00
parent 1f6b2f7be5
commit 6f2b32d04a
4 changed files with 55 additions and 13 deletions

BIN
a.out

Binary file not shown.

BIN
trees.cmi

Binary file not shown.

BIN
trees.cmo

Binary file not shown.

View File

@ -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" ;;