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 {}
-- | 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)
-- | 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