AufgabenLoesungen_Tag16.hs ProInformatik, Musterlösungen Tag 16 data Baum a = Leer | B (Baum a) a (Baum a) deriving Show Aufgabe 16.2 a) Definieren Sie eine Funktion inorder::Baum a -> [a], die die Liste der Knotenwerte eines binären Baums in inorder-Reihenfolge ("linker Teilbaum, Wurzel, rechter Teilbaum") berechnet. Benutzen Sie den Beispielbaum aus Aufgabe 16.1 und rufen Sie mit ihm die Funktion inorder auf. Ihre Ausgabe sollte die Knoten in folgender Reihenfolge wiedergeben: "PROINFORMATIK" inorder:: Baum a -> [a] inorder Leer = [] inorder (B l e r) = (inorder l) ++[e]++(inorder r) b) Schreiben Sie eine Funktion tiefe :: a ->Baum a-> Int, der die Tiefe eines Knotens im Baum zurückliefert. Damit der Algorithmus funktioniert muss eingeschränkt werden, dass jedes Element im Baum nur einmal vorkommt, sonst ist es nicht möglich das Element im Baum eindeutig zu bestimmten. Um die Aufbau zu lösen wird der gesamte Baum in einen neuen Baum überführt, der für jeden Knoten die Tiefe speichert. data BaumB a = Leerl |BB (BaumB a) a Int (BaumB a) deriving Show tiefe :: Eq a => a ->Baum a-> Int tiefe x Leer = 0 tiefe x b = such x (aufbau 0 b) such x Leerl = 0 such x (BB l e t r) | x == e = t | otherwise = such x l + such x r aufbau akk Leer = Leerl aufbau akk (B l e r) = BB (aufbau (akk+1) l) e akk (aufbau (akk+1) r) c) Schreiben Sie eine Funktion reflect :: Baum a -> Baum a, die in einem binären Baum jeweils alle linken mit allen rechten Teilbäumen vertauscht. reflect :: Baum a -> Baum a reflect Leer = Leer reflect (B l e r) = B (reflect r) e (reflect l) d) Schreiben Sie eine Funktion sumB zur Berechnung der Summe der Knotenwerte eines Baums Baum Int. sumB Leer = 0 sumB (B l e r) = e+(sumB l) + (sumB r) e) Schreiben Sie eine Funktion mapNodes, die - analog zu map für Listen eine Funktion f auf alle Knoten eines binären Baums anwendet. mapNodes :: (a -> b) -> Baum a -> Baum b mapNodes f Leer = Leer mapNodes f (B l e r) = B (mapNodes f l) (f e) (mapNodes f r) f) Schreiben Sie eine Funktion pruefB, die einen Int-Wert n und einen Baum vom Typ Baum Int bekommt und entscheidet, ob n Knoten des Baums ist. pruefB x Leerl = False pruefB x (B l e r) | x == e = True | otherwise = pruef x l || pruefB x r Page 1 AufgabenLoesungen_Tag16.hs g) Schreiben Sie die Funktion minMax, die einen Baum vom Typ Baum Int bekommt und ein 2er Tupel zurück gibt, das den maximalen und den minimalen Knotenwert des Baumes enthält. Ihre Lösung sollte so definiert sein, dass ein einziger Durchlauf im Baum ausreicht. h) Machen Sie den Datentyp Baum a zu einer instance von Eq (ohne dabei deriving zu verwenden). instance Eq a=> Eq (Baum a) where (==) Leer Leer = True (==) (B l e r)(B a x b) = (e==x) && (l==a) && (r==b) Page 2