7. Aufgaben zur Vorbereitung auf Klausur und Abitur#

7.1. Aufgabe#

Welcher abstrakte Datentyp ist jeweils sinnvoll für die folgenden Anwendungen. Entscheide dich zwischen Liste, Stapel, Warteschlange, assoziatives Array und Baum.

  1. Organigramm einer Firma
    Darstellung der hierarchischen Struktur einer Organisation und ihrer Abteilungen.

  2. Verarbeitung von Support-Anfragen
    Anfragen werden in der Reihenfolge bearbeitet, in der sie eingehen.

  3. Undo-Funktion in einem Texteditor
    Schritte rückgängig machen in der Reihenfolge, in der sie durchgeführt wurden.

  4. Produktkatalog mit schnellen Suchfunktionen
    Zuordnung von Produktnamen zu Preisen und Lagerbeständen für schnellen Zugriff.

  5. Dateisystem auf einem Computer
    Organisieren und Speichern von Dateien in einer hierarchischen Struktur.

  6. Navigation im Browser
    Speichern der zuletzt besuchten Webseiten, um bei Bedarf zurückzukehren.

  7. Liste wartender Patienten
    Patienten in einer Reihenfolge verwalten, die (je nach Dringlichkeit) flexibel erweitert und angepasst werden kann.

7.2. Aufgabe Verkettete Listen: Objektdiagramm zeichnen#

Für die Produktion des Films “Bibi und Tina (Teil 17)” werden - warum auch immer - alle im Drehbuch vorkommenden Figuren in einer verketteten Liste verwaltet. Der folgende Pseudocode erzeugt diese Liste mit den Klassen und Methoden aus dem Klassendiagram in Abb. 3.3.

Stelle die so entstandene Datenstruktur als Objektdiagramm dar.

Hinweis: Die Klassen Mensch und Pferd sind Unterklassen von Figur. Jedes Figur-Objekt hat ein Attribut name, das beim Erzeugen durch einen Parameter des jeweiligen Konstruktors gesetzt wird.

liste = NEU VerketteteListe<Figur>()
liste.anhaengen(NEU Mensch("Tina"))
liste.anhaengen(NEU Mensch("Bibi"))
liste.einfuegen(1, NEU Pferd("Amadeus"))
liste.einfuegenVorne(NEU Pferd("Sabrina"))
liste.entfernen(2)

7.3. Aufgabe Verkettete Listen: Operation implementieren#

Implementiere die Methode anhaengen der Klasse VerketteteListe in Pseudocode oder Python, so wie sie im Klassendiagramm in Abb. 3.3 vorkommt.

7.4. Aufgabe Stapel#

Was gibt der folgende Code aus?

s1 = Stapel()
s2 = Stapel()

s1.push("Birne")
s1.push("Apfel")

s2.push("Kirsche")
s2.push("Banane")
s2.push("Erdbeere")

while not s1.ist_leer():
    t = s1.pop()
    s2.push(t)

while not s2.ist_leer():
    print(s2.pop())  

7.5. Aufgabe Binärbaum: Preorder/Postorder/Inorder#

Betrachte den folgenden Baum.

../_images/aufgabe_binbaum_suchbaum_seed40.svg

a) Beantworte die folgenden Fragen:

  1. Wie viele Blätter hat der Baum?

  2. Welche Tiefe hat der Baum?

  3. Wie viele Knoten befinden sich im rechten Teilbaum des linken Teilbaums der Wurzel?

b) Liste alle Elemente des Baums auf in

  • Preorder-

  • Postorder- und

  • Inorder-Reihenfolge.

7.6. Aufgabe Binärbaum: Operation implementieren#

Der folgende Binärbaum soll aufgebaut werden:

../_images/baum_abitur.svg

Nutze die Klassen und Methoden aus Abb. 6.17 um den Baum in Pseudocode oder Python zu erzeugen.

7.7. Aufgabe Binärbaum: Rekursion verstehen#

Betrachte den folgenden Baum.

../_images/aufgabe_rekursion_verstehen_seed310347.svg

Was gibt die folgende rekursive Funktion aus, wenn sie mit der Wurzel des Baums als Argument aufgerufen wird? Begründe deine Antwort.

def geheimfunktion(k: Knoten|None) -> int:
    if k is None:
        return 999999999
    tmp1 = geheimfunktion(k.linker_teilbaum)
    tmp2 = geheimfunktion(k.rechter_teilbaum)
    tmp3 = k.inhalt
    ergebnis = tmp1
    if tmp2 < ergebnis:
        ergebnis = tmp2
    if tmp3 < ergebnis:
        ergebnis = tmp3
    return ergebnis

7.8. Aufgabe Binärbaum: Rekursion programmieren#

Ergänze den untenstehenden Code zu einer rekursiven Funktion summe(knoten: Knoten|None), die die Summe aller Werte berechnet, die in dem Baum gespeichert sind.
(Beispiel: Für den Baum aus der vorigen Abbildung müsste die Funktion den Wert 432 als Summe aller Knoteninhalte berechnen.)

def summe(knoten: Knoten|None) -> int:
    """gibt die Summe aller Werte im Baum mit der Wurzel knoten zurück"""
    ...