\begin{slide}{Beispielcode (Übungen}

\begin{verbatim}
data Tree k
     = Branch { left :: Tree k, key :: k, right :: Tree k }
     | Leaf   { }
  deriving Show

-- | vollständiger binärer Baum der Höhe h
full :: Integer -> Tree Integer
full h =
     if h > 0
     then Branch { left = full (h-1), key = h, right = full (h-1) }
     else Leaf {}

-- | Fibonacci-Baum
fib :: Integer -> Tree Integer
fib h =
     case h > 0 of
       True  -> Branch { left = fib (h-1), key = h, right = fib (h-2) }
       False ->  Leaf {}
\end{verbatim}
  
\begin{verbatim}
-- | Anzahl der Branch-Konstruktoren im Baum
branches :: Tree k -> Integer
branches t = case t of
    Leaf {} -> 0
    Branch {} -> branches (left t) + 1 + branches (right t)

-- | Inorder-Liste der Schlüssel
inorder :: Tree k -> [ k ]
inorder t = case t of
    Leaf {} -> []
    Branch {} -> inorder (left t) ++ [key t] ++ inorder (right t)
\end{verbatim}
  
\begin{verbatim}
-- | Hausaufgabe 1:
-- Einfügen eines Schlüssels in einen (unbalancierten) Suchbaum
insert :: Ord k => Tree k -> k -> Tree k
insert t k =  ... key t < k ...

-- | Hausaufgabe 2:
-- Herstellen eines (unbalancierten) Suchbaums aus einer Liste von Schlüsseln
fromList :: Ord k => [ k ] -> Tree k
fromList l = case l of
   x : xs -> ...
   []     -> ...

-- | Hausaufgabe 3:
-- vergleiche Leistung dieser beiden Funktionen:
sort1, sort2 :: Ord k => [k] -> [k]
sort1 = inorder . fromList
sort2 = Data.Set.toAscList . Data.Set.fromList
\end{verbatim}
  

\end{slide}
