@@ -3,14 +3,14 @@ datatype tree = empty | node of int * tree * tree
3
3
fun arrange filename =
4
4
let
5
5
val ins = TextIO.openIn filename
6
- val _ = TextIO.inputLine ins
6
+ val _ = TextIO.inputLine ins (* Ignore the first line population n is not needed *)
7
7
val line = TextIO.inputLine ins
8
8
val _ = TextIO.closeIn ins
9
9
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 *)
12
12
13
- (* Creating the tree from the list *)
13
+ (* Creating the tree from the list | Given the tree in a preorder list *)
14
14
fun create_tree [] = (empty, [])
15
15
| create_tree (0 ::rest) = (empty, rest)
16
16
| create_tree (n::rest) =
@@ -21,25 +21,25 @@ fun arrange filename =
21
21
(node(n, left, right), xsAfterRight)
22
22
end
23
23
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
43
43
44
44
(* Print the in-order traversal of the tree *)
45
45
fun print_tree empty = ()
@@ -49,7 +49,7 @@ fun arrange filename =
49
49
print_tree right
50
50
)
51
51
52
- val (tree,_) = create_tree treelist
52
+ val (tree, _) = create_tree treelist
53
53
val (arranged_tree, _) = arrange_tree tree
54
54
in
55
55
print_tree arranged_tree
0 commit comments