Skip to content

Commit be1df5e

Browse files
committed
Revised versions
1 parent 75f1dcd commit be1df5e

File tree

2 files changed

+28
-34
lines changed

2 files changed

+28
-34
lines changed

1st_Set/arrange.sml

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ datatype tree = empty | node of int * tree * tree
33
fun arrange filename =
44
let
55
val ins = TextIO.openIn filename
6-
val _ = TextIO.inputLine ins
6+
val _ = TextIO.inputLine ins (* Ignore the first line population n is not needed*)
77
val line = TextIO.inputLine ins
88
val _ = TextIO.closeIn ins
99
val treelist = case line of
10-
NONE => []
11-
| SOME s => map (fn x => valOf (Int.fromString x)) (String.tokens (fn c => c = #" ") s)
10+
NONE => [] (* If the line is empty, return an empty list *)
11+
| SOME s => map (fn x => valOf (Int.fromString x)) (String.tokens (fn c => c = #" ") s) (* Parse the line into a list of integers *)
1212

13-
(* Creating the tree from the list *)
13+
(* Creating the tree from the list | Given the tree in a preorder list *)
1414
fun create_tree [] = (empty, [])
1515
| create_tree (0::rest) = (empty, rest)
1616
| create_tree (n::rest) =
@@ -21,25 +21,25 @@ fun arrange filename =
2121
(node(n, left, right), xsAfterRight)
2222
end
2323

24-
(* Function arrange_tree *)
25-
fun arrange_tree (empty) = (empty, NONE)
26-
| arrange_tree (node(x, left, right)) =
27-
let
28-
val (l', minl) = arrange_tree left
29-
val (r', minr) = arrange_tree right
30-
in
31-
case (minl, minr) of
32-
(NONE, NONE) => (node (x, l', r'), SOME x)
33-
| (NONE, SOME minr) =>
34-
if minr < x then (node (x, r', l'), SOME minr)
35-
else (node (x, l', r'), SOME x)
36-
| (SOME minl, NONE) =>
37-
if minl < x then (node (x, l', r'), SOME minl)
38-
else (node (x, r', l'), SOME x)
39-
| (SOME minl, SOME minr) =>
40-
if minr < minl then (node (x, r', l'), SOME minr)
41-
else (node (x, l', r'), SOME minl)
42-
end
24+
(* Arranging the tree in order to get the smallest value lexicographically tree in in order form *)
25+
fun arrange_tree empty = (empty, NONE)
26+
| arrange_tree (node(v, left_subtree, right_subtree)) =
27+
let
28+
val (arranged_left, left_min) = arrange_tree left_subtree
29+
val (arranged_right, right_min) = arrange_tree right_subtree
30+
31+
fun swap () = (node(v, arranged_right, arranged_left), right_min)
32+
fun retain () = (node(v, arranged_left, arranged_right), left_min)
33+
34+
val result =
35+
case (left_min, right_min) of
36+
(NONE, NONE) => (node(v, arranged_left, arranged_right), SOME v)
37+
| (NONE, SOME rm) => if rm < v then swap () else retain ()
38+
| (SOME lm, NONE) => if lm < v then retain () else swap ()
39+
| (SOME lm, SOME rm) => if rm < lm then swap () else retain ()
40+
in
41+
result
42+
end
4343

4444
(* Print the in-order traversal of the tree *)
4545
fun print_tree empty = ()
@@ -49,7 +49,7 @@ fun arrange filename =
4949
print_tree right
5050
)
5151

52-
val (tree,_) = create_tree treelist
52+
val (tree, _) = create_tree treelist
5353
val (arranged_tree, _) = arrange_tree tree
5454
in
5555
print_tree arranged_tree

1st_Set/expected outputs.txt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,8 @@ Testcase: tree2
1212
Testcase: tree9
1313
1 2 5 3 4 6
1414

15+
arrange("tree0.txt");
16+
arrange("tree1.txt");
17+
arrange("tree2.txt");
18+
arrange("tree9.txt");
1519

16-
17-
i want an algorithm like that:
18-
19-
find at the lowest level the smallest value, make the subtree with the smallest value at the deepest level the left subtree of the tree.
20-
21-
check in the trees if the smallest value is on the left, if not we swap them.
22-
23-
the swaps should only be in the children of the nodes, we cannot swap nodes themselves.
24-
25-
i want this in ML

0 commit comments

Comments
 (0)