data Tree a = Leaf height Leaf = 0 height (Node n _ _ _) = n insertFree index x Leaf = Just (Node index Leaf x Leaf) insertFree _ x (Node level Leaf val right) = Just (Node level (Node (level-1) Leaf x Leaf) val right) insertFree _ x (Node level left val Leaf) = Just (Node level left val (Node (level-1) Leaf x Leaf)) -- insertFree _ _ _ = Nothing -- make balanced, binary tree (height diff is <= 1) -- Note - I would've liked to have kept `foldTree` point-free, -- but I'm not sure how to do that since I need `xs` for `treeHeight` foldTree :: [a] -> Tree a treeHeight = getBinTreeHt xs -- get Binary Tree Height (used to start making the Tree) -- insert where there's a Leaf, otherwise choose Left insertFreeOrLeft index x Leaf = Node index Leaf x Leaf insertFreeOrLeft _ x (Node level Leaf val right) = Node level (Node (level-1) Leaf x Leaf) val right insertFreeOrLeft _ x (Node level left val Leaf) = Node level left val (Node (level-1) Leaf x Leaf) insertFreeOrLeft _ x (Node level left val right) = Node level (insertFreeOrLeft (level-1) x left) val right -- insert where there's a Leaf, otherwise choose Right insertFreeOrRight index x Leaf = Node index Leaf x Leaf insertFreeOrRight _ x (Node level left val Leaf) = Node level left val (Node (level-1) Leaf x Leaf) insertFreeOrRight _ x (Node level Leaf val right) = Node level (Node (level-1) Leaf x Leaf) val right insertFreeOrRight _ x (Node level left val right) = Node level left val (insertFreeOrRight (level-1) x right) layoutTree Leaf = [] -- wow, that was easy layoutTree (Node _ left here right)
Standard input is empty
0
4
8
2
12
6
16
10
20
14
24
18
28
22
32
26
36
30
40
34
44
38
48
42
52
46
56
50
60
54
64
58
68
62
72
66
76
70
80
74
84
78
88
82
92
86
96
90
100
94
104
98
108
102
112
106
116
110
120
114
124
118
126
122
127
121
125
117
123
113
119
109
115
105
111
101
107
97
103
93
99
89
95
85
91
81
87
77
83
73
79
69
75
65
71
61
67
57
63
53
59
49
55
45
51
41
47
37
43
33
39
29
35
25
31
21
27
17
23
13
19
9
15
5
11
1
7
3