AufgabenLoesungen_Tag16.hs ProInformatik, Musterlösungen Tag

Werbung
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
Herunterladen