--------------------------------------SuchBaeme

data Ord a => STree a = Node a (STree a) (STree a) | Nil
        -- polymorphic tree type with constrained on base type
        -- note: empty leaves

insertSTree :: Ord a => a -> STree a -> STree a
insertSTree x Nil = Node x Nil Nil
insertSTree x (Node y left right)
   | x<=y       = Node y (insertSTree x left) right
   | otherwise  = Node y left (insertSTree x right)

elemSTree :: Ord a => a -> STree a -> Bool
elemSTree x Nil = False
elemSTree x (Node y left right)
   | x==y       = True
   | x<y        = elemSTree x left
   | otherwise  = elemSTree x right

listToSTree :: Ord a => [a] -> STree a
listToSTree = foldr insertSTree Nil

sTreeToList :: Ord a => STree a -> [a]
sTreeToList Nil = []
sTreeToList (Node x left right)
   = (sTreeToList left) ++ [x] ++ (sTreeToList right)

miniList = [1,5,-3,6,0,99,4,4,55,1000,-1000]

{-
Main> :t Node 3.14 Nil Nil
Node 3.14 Nil Nil :: (Ord a, Fractional a) => STree a
Main> :t Node cos Nil Nil

ERROR: a -> a is not an instance of class "Ord"
Main> elemSTree 0 (listToSTree miniList)
True
Main> elemSTree 77 (listToSTree miniList)
False
Main> (sTreeToList.listToSTree) miniList  -- sort!
[-1000, -3, 0, 1, 4, 4, 5, 6, 55, 99, 1000]
Main> (sTreeToList.listToSTree) (map abs miniList)
[0, 1, 3, 4, 4, 5, 6, 55, 99, 1000, 1000]
-}

