[back]

Binary Tree Insertion

type 'a tree
  = Empty
  | Node of 'a * 'a tree * 'a tree

A binary tree is ordered if, given Node (a, left, right), every element of left is at most a and every element of right is greater than a. Repetitions are allowed.

Implement the function

val insert : 'a -> 'a tree -> 'a tree

so that insert x t, given an ordered tree t, is an ordered tree with the same elements as t along with the new element x.

Challenge worth nothing: Make your implementation tail recursive.

Examples

let _ = assert (insert 5 Empty = Node (5, Empty, Empty))

let t = Node (5, Empty, Empty)
let _ = assert (insert 3 t = Node (5, Node (3, Empty, Empty), Empty))
let _ = assert (insert 8 t = Node (5, Empty, Node (8, Empty, Empty)))

let _ = assert (insert 4 (insert 8 (insert 3 (insert 5 Empty))) =
    Node (5, Node (3, Empty, Node (4, Empty, Empty)), Node (8, Empty, Empty)))