Binary Search Tree
A simple binary search tree using an ADT and recursion.
The tree type
A tree is either empty or a node with a left subtree, a value, and a right subtree:
type Tree =
| Empty
| Node Tree Int TreeInsert and lookup
Both functions recurse down the tree, branching left or right based on comparison:
insert t x = case t {
Empty -> Node Empty x Empty
Node l v r ->
if x < v then Node (insert l x) v r
else if x > v then Node l v (insert r x)
else t
}
contains t x = case t {
Empty -> False
Node l v r ->
if x == v then True
else if x < v then contains l x
else contains r x
}In-order traversal
Walking the tree in order produces a sorted list:
to_list t = case t {
Empty -> []
Node l v r -> List.append (to_list l) (v :: to_list r)
}Putting it together
main () = {
let t = List.foldl insert Empty [5, 3, 7, 1, 4, 6, 8]
to_list t |> dbg
contains t 4 |> dbg
contains t 9 |> dbg
}Output:
[1, 3, 4, 5, 6, 7, 8]
True
False
Full source
type Tree =
| Empty
| Node Tree Int Tree
insert t x = case t {
Empty -> Node Empty x Empty
Node l v r ->
if x < v then Node (insert l x) v r
else if x > v then Node l v (insert r x)
else t
}
contains t x = case t {
Empty -> False
Node l v r ->
if x == v then True
else if x < v then contains l x
else contains r x
}
to_list t = case t {
Empty -> []
Node l v r -> List.append (to_list l) (v :: to_list r)
}
main () = {
let t = List.foldl insert Empty [5, 3, 7, 1, 4, 6, 8]
to_list t |> dbg
contains t 4 |> dbg
contains t 9 |> dbg
}