(*tsearch*) (* Tree search data structures and traversal and insertion fns *) (* An 'a tree has (1) a left branch (which is an 'a tree or tempty) (2) an 'a value (3) a right branch (which is an 'a tree or tempty) In addition we have the "constructor" Tree. *) datatype 'a tree = tempty|Tree of ('a tree * 'a * 'a tree); fun leaf x = Tree(tempty,x,tempty); (* A terminal node is called a leaf and is created as above *) fun leafp (Tree(tempty,_,tempty)) = true |leafp anything_else = false; (* Given a node within a tree, is it a leaf node? *) fun tree_insert p x tempty = leaf x |tree_insert p x (Tree(l,y,r)) = if p x y then Tree(tree_insert p x l,y,r) else Tree(l,y,tree_insert p x r); (* Given some binary predicate p (that is p is a fn 'a -> 'a -> bool) tree_insert inserts x into that tree. If (p x y) is true then x is inserted in the left branch, otherwise x is inserted into the right branch. Function tree_insert delivers a new 'a tree *) fun preorder tempty = [] |preorder (Tree(l,x,r)) = [x] @ preorder l @ preorder r; (* A preorder traversal of a tree. Given a node get the contents of the node, then preorder left of the node, then preorder right of the node*) fun inorder tempty = [] |inorder (Tree(l,x,r)) = inorder l @ [x] @ inorder r; (* An inorder traversal of a tree. Given a node inorder left of the node then get the contents of the node then inorder right of the node *) fun postorder tempty = [] |postorder (Tree(l,x,r)) = postorder l @ postorder r @ [x]; (* Functions preorder, inorder and postorder traverse an 'a tree. Try them. *) fun lt (a:int) (b:int) = a