2. Die rekursive Datenstruktur Baum 2.2 Suchen und Einfügen Für den abgebildeten geordneten Binärbaum gilt, dass alle Elemente des rechten Teilbaumes eines Knotens größer als der Inhalt dieses Knotens sind. Aus dieser Eigenschaft ergibt sich ein einfacher rekursiver Algorithmus für die Suche nach einem Element (z.B. 16): Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
rechter Nachfolger vorhanden wahr Zu suchendes Element: 16 Aktiver Knoten: 10 10 = 16 falsch 10 > 16 falsch rechter Nachfolger vorhanden wahr führe die Methode beim rechten Nachfolger aus Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
linker Nachfolger vorhanden wahr Zu suchendes Element: 16 Aktiver Knoten: 18 18 = 16 falsch 18 > 16 wahr linker Nachfolger vorhanden wahr führe die Methode beim linken Nachfolger aus Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
rechter Nachfolger vorhanden wahr Zu suchendes Element: 16 Aktiver Knoten: 15 15 = 16 falsch 15 > 16 falsch rechter Nachfolger vorhanden wahr führe die Methode beim rechten Nachfolger aus Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
gib wahr oder das Element zurück Suche beendet Zu suchendes Element: 16 Aktiver Knoten: 16 16 = 16 wahr gib wahr oder das Element zurück Suche beendet Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
rechter Nachfolger vorhanden falsch gib falsch oder null zurück Falls das zu suchende Element nicht im Baum vorhanden ist, führt der Algorithmus zu einem Blatt des Baumes: Zu suchendes Element: 2 ... Aktiver Knoten: 1 1 = 1 falsch 1 > 2 falsch rechter Nachfolger vorhanden falsch gib falsch oder null zurück Suche beendet Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Struktogramm: daten.schluesselIstGroesserAls(suchwert) Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Einzufügendes Element: 12 Aktiver Knoten: 10 10=12 falsch Der Algorithmus zum Einfügen eines Elements funktioniert nach einem ähnlichen Prinzip wie das Suchen. Falls das Element im Baum schon vorhanden ist, soll es nicht eingefügt werden. Deshalb wird beim aktiven Knoten jeweils geprüft, ob dessen Inhalt mit dem einzufügenden Element übereinstimmt. Alternativ könnte man auch zunächst den Suchalgorithmus ausführen. Einzufügendes Element: 12 Aktiver Knoten: 10 10=12 falsch 10>12 falsch rechter Nachfolger vorhanden wahr führe die Methode beim rechten Nachfolger aus Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Einzufügendes Element: 12 Aktiver Knoten: 18 18=12 falsch 18>12 wahr linker Nachfolger vorhanden wahr führe die Methode beim linken Nachfolger aus Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Einzufügendes Element: 12 Aktiver Knoten: 15 15=12 falsch 15>12 wahr linker Nachfolger vorhanden falsch setze 12 als linken Nachfolger Einfügen beendet Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2 Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 1 – Suchen und Einfügen Führe die Algorithmen zum Suchen und Einfügen mit einem Baum-Visualisierungs-Tool durch https://www.cs.usfca.edu/~galles/visualization/BST.html oder: http://www.bvt.ct-labs.de/ Füge in einen leeren Baum die Elemente jeweils in unterschiedlicher Reihenfolge ein. Vergleiche die Ergebnisse und beschreibe die Besonderheiten, Gemeinsamkeiten, deren Ursachen und mögliche Auswirkungen. Überlege für jede Teilaufgabe weitere Sequenzen, die auf unterschiedliche Weise den gleichen Baum erzeugen. 10, 18, 3, 15, 16, 19, 1, 17 10, 16, 1, 18, 19, 15, 17, 3 1, 3, 10, 15, 16, 17, 18, 19 10, 3, 18, 15, 19, 16, 17, 1 Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 2 – Implementieren eines Baumes Mach dich zunächst mit der Implementierung eines Wörterbuchs als Liste mit Kompositum vertraut. Der Konstruktor der Klasse Woerterbuch erzeugt eine Liste mit 15 Einträgen. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 2 – Implementieren eines Baumes Das Wörterbuch soll nun als geordneter Binärbaum (zunächst ohne Kompositum) modelliert und implementiert werden. Klassendiagramm: nächste Folie Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Informatik 11 - 1. Die rekursive Datenstruktur Baum – 2 Informatik 11 - 1. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 2 – Implementieren eines Baumes Das Wörterbuch soll nun als geordneter Binärbaum (zunächst ohne Kompositum) modelliert und implementiert werden. Verwende als Vorlage das BlueJ Projekt binbaum_woerterbuch_vorlage und implementiere in den Klassen Binbaum und Knoten die benötigten Methoden. Die Methoden suchen und istVorhanden in der Klasse Knoten unterscheiden sich im Wesentlichen nur durch den Rückgabewert. Die Methoden istKleinerAls und schluesselIstKleinerAls unterscheiden sich Im Wesentlichen nur durch den Typ des Übergabeparameters. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 3* – Entfernen eines Knotens Das Entfernen eines Knotens ist ein etwas anspruchsvollerer Algorithmus und kein Pflichtinhalt. Man unterscheidet drei Fälle: Fall 1: Der zu entfernende Knoten ist ein Blatt (z.B. “care“) Der Knoten kann direkt entfernt werden. Neuer linker Nachfolger von “cat“ ist null. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 3* – Entfernen eines Knotens Fall 2: Der zu entfernende Knoten hat nur einen Nachfolger (z.B. “car“) Der unter “car“ liegende Teilbaum kann nach oben geschoben werden. Neuer linker Nachfolger von “clip“ ist “cat“. Beim Implementieren lässt sich dies am einfachsten dadurch erreichen, dass die Methode entfernen einen Rückgabewert erhält. Der Rückgabewert des Aufrufs entfernen(“car“) ist “cat“ und diese Referenz wird als neuer linker Nachfolger von “clip“ gesetzt. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 3* – Entfernen eines Knotens Fall 3: Der zu entfernende Knoten hat zwei Nachfolger (z.B. “crab“) In diesem Fall kann man den zu entfernenden Knoten durch den kleinsten Knoten des rechten Teilbaums ersetzen, in diesem Beispiel “crow“. Dadurch bleibt die Ordnung des gesamten Baumes erhalten. Alternativ kann man den zu entfernenden Knoten natürlich auch durch das Maximum des linken Teilbaums, in diesem Beispiel “cook“, ersetzen. Minimum des rechten Teilbaums von “crab“ Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 3* – Entfernen eines Knotens Erzeuge mit dem Baum-Visualisierungs-Tool den Beispielbaum und teste die Methode zum Entfernen für die drei verschiedenen Fälle. Implementiere die benötigten Methoden. Als Vorlage kannst du das BlueJ Projekt binbaum_woerterbuch_entfernen_vorlage verwenden. Im Quelltext findest du ausführliche Kommentare als Hilfestellung. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 4 – Tiefe (Höhe) des Baumes, Tiefe eines Knotens Die Tiefe eines Knotens ist die Anzahl der Kanten, die beim Durchlauf von der Wurzel bis zum Knoten beschritten werden. Die Wurzel hat die Tiefe 0. Im Beispielbaum ist die Tiefe von “cave“ gleich 2. Die Höhe oder die Tiefe des Baumes ist die maximale Tiefe, also im Beispiel gleich 3. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 4 – Tiefe (Höhe) des Baumes, Tiefe eines Knotens Ergänze den Baum um folgende Methoden: Klasse Binbaum public int tiefeGeben() Gibt die Tiefe des Baums als Rückgabewert aus. Rufe dazu die Methode wurzel.tiefeGeben(0) auf. Klasse Binbaum public int tiefeGeben(String suchSchluessel) Gibt die Tiefe des Knotens aus. Falls kein Knoten mit suchSchluessel als Inhalt existiert, soll der Wert -1 ausgegeben werden. Rufe dazu die Methode wurzel.tiefeGeben(suchSchluessel, 0) auf. Klasse Knoten public int tiefeGeben(int aktTiefe) Berechnet rekursiv die Tiefe des Knotens. Der Übergabeparameter wird benötigt, um ein globales Attribut von Knoten zu vermeiden, welches die aktuelle Tiefe speichert. Die Wurzel hat die Tiefe 0. Erstelle zwei lokale Attribute maxTiefeLinkerTeilbaum und maxTiefeRechterTeilbaum, deren Werte rekursiv bestimmt werden können, indem vom linken bzw. vom rechten Nachfolger die Methode tiefeGeben(aktTiefe+1) aufgerufen wird. Klasse Knoten public int tiefeGeben(String suchSchluessel,int aktTiefe) berechnet rekursiv die Tiefe des Knotens mit suchSchluessel als Inhalt. Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 5* – Binomialkoeffizienten und Pascalsches Dreieck Mathematischer Hintergrund 1: Die Binomialkoeffizienten geben an, wie viele Möglichkeiten es gibt, aus einer Menge mit 𝑛 Elementen 𝑘 Elemente ohne Berücksichtigung der Reihenfolge und ohne Zurücklegen (man sagt auch „Ziehen mit einem Griff“) auszuwählen. Beispiel: Aus der Menge 𝑎,𝑏,𝑐,𝑑,𝑒 sollen nach obiger Auswahlregel drei Elemente gezogen werden. (𝑛=5 und 𝑘=3) Das direkte Aufzählen ergibt 𝑎,𝑏,𝑐 , 𝑎,𝑏,𝑑 , 𝑎,𝑏,𝑒 , 𝑎,𝑐,𝑑 , 𝑎,𝑐,𝑒 , 𝑎,𝑑,𝑒 , 𝑏,𝑐,𝑑 , 𝑏,𝑐,𝑒 , 𝑏,𝑑,𝑒 , 𝑐,𝑑,𝑒 , also 10 Möglichkeiten. Im Mathematikunterricht (Q12) lernt man, dass die Formel 𝑛! 𝑘!⋅ 𝑛−𝑘 ! mit 𝑛≥𝑘 diese Anzahl allgemein berechnet. Man schreibt dafür auch 𝑛 𝑘 und spricht „n über k“ oder auch „k aus n“. 𝑛 𝑘 heißt auch Binomialkoeffizient. Im Beispiel ist: 5 3 = 5! 3!⋅ 5−3 ! = 5! 3!⋅2! = 5⋅4⋅𝟑⋅𝟐⋅𝟏 𝟑⋅𝟐⋅𝟏⋅2⋅1 = 5⋅4 2⋅1 =10 Sonderfälle: 𝑛 1 = 𝑛! 1!⋅ 𝑛−1 ! = 𝑛! 𝑛−1 ! =𝑛 𝑛 𝑛 = 𝑛! 𝑛!⋅ 𝑛−𝑛 ! = 𝑛! 𝑛!⋅0! =1 (Deshalb definiert man 0! =1) 𝑛 0 = 𝑛! 0!⋅ 𝑛−0 ! = 𝑛! 0!⋅𝑛! =1 Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
𝑏𝑖𝑛 𝑛,𝑘 = 1 , 𝑤𝑒𝑛𝑛 𝑘=0 𝑜𝑑𝑒𝑟 𝑛=𝑘 𝑏𝑖𝑛 𝑛−1,𝑘−1 +𝑏𝑖𝑛 𝑛−1,𝑘 ,𝑠𝑜𝑛𝑠𝑡 Übung 5* – Binomialkoeffizienten und Pascalsches Dreieck Mathematischer Hintergrund 2: Für die Binomialkoeffizienten gibt es zwei wichtige Zusammenhänge: 𝑛 𝑘 = 𝑛 𝑛−𝑘 𝑛 𝑘 = 𝑛−1 𝑘−1 + 𝑛−1 𝑘 Beweise diese Formeln! Die zweite Formel ist eine Rekursionsvorschrift. Schreibt man 𝑛 𝑘 als Funktion mit zwei Argumenten, gilt: 𝑏𝑖𝑛 𝑛,𝑘 = 1 , 𝑤𝑒𝑛𝑛 𝑘=0 𝑜𝑑𝑒𝑟 𝑛=𝑘 𝑏𝑖𝑛 𝑛−1,𝑘−1 +𝑏𝑖𝑛 𝑛−1,𝑘 ,𝑠𝑜𝑛𝑠𝑡 Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 5* – Binomialkoeffizienten und Pascalsches Dreieck Mathematischer Hintergrund 3: Die Binomialkoeffizienten tauchen im Binomischen Lehrsatz auf: 𝑎+𝑏 𝑛 = 𝑎 𝑛 + 𝑛 1 𝑎 𝑛−1 𝑏+ 𝑛 2 𝑎 𝑛−2 𝑏 2 + 𝑛 3 𝑎 𝑛−3 𝑏 3 +…+ 𝑛 𝑛−2 𝑎 2 𝑏 𝑛−1 + 𝑛 𝑛−1 𝑎 1 𝑏 𝑛−1 + 𝑏 𝑛 Vewendet man 𝑛 0 = 𝑛 𝑛 =1 und 𝑏 0 = 𝑎 0 =1 kann man in die Summe noch systematischer schreiben: 𝑎+𝑏 𝑛 = 𝑛 0 𝑎 𝑛 𝑏 0 + 𝑛 1 𝑎 𝑛−1 𝑏+ 𝑛 2 𝑎 𝑛−2 𝑏 2 +…+ 𝑛 𝑛−1 𝑎 1 𝑏 𝑛−1 + 𝑛 𝑛 𝑎 0 𝑏 𝑛 Oder mit der praktische Summenschreibwiese: 𝑎+𝑏 𝑛 = 𝑖=0 𝑛 𝑛 𝑖 𝑎 𝑛−𝑖 𝑏 𝑖 Teste die Formel für 𝑎+𝑏 2 und 𝑎+𝑏 3 . Hinweis: Die Formel lässt sich selbstverständlich beweisen. Dies funktioniert z.B. mithilfe des Beweisverfahrens der vollständigen Induktion. Mathematisch ist der Beweis nicht sehr schwer, allerdings braucht man etwa Erfahrung mit der Darstellung der Summenschreibweise. Einen Beweis findest du z.B. hier: https://de.wikibooks.org/wiki/Beweisarchiv:_Algebra:_Ringe:_Binomischer_Lehrsatz Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 5* – Binomialkoeffizienten und Pascalsches Dreieck Mathematischer Hintergrund 4: Das Pascalsche Dreieck ist ein Zahlenschema, in dem genau die Binomialkoeffizienten stehen: In der fünften Reihe stehen die Werte von 4 0 , 4 1 , 4 2 , 4 3 und 4 4 . Man kann also leicht ablesen: 𝑎+𝑏 4 = 𝑎 4 +4 𝑎 3 𝑏+6 𝑎 2 𝑏 2 +4𝑎 𝑏 3 + 𝑏 4 Wie entsteht eine Reihe aus der darüber stehenden Reihe? Welcher Zusammenhang zwischen den Binomialkoeffizienten wird dabei verwendet? Informatik 11 - 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen
Übung 5* – Binomialkoeffizienten und Pascalsches Dreieck Informatik a) Lässt sich das Pascalsche Dreieck sinnvoll als Baum interpretieren? b) Schreibe ein Programm, das eine Methode pascalDreieck(int hoehe) enthält, welche das Dreieck ausgibt, i) mit Hilfe einer rekursiv definierten Methode für die Binomialkoeffizienten. ii) mit Hilfe der als Listen gespeicherten Zeilen des Dreiecks. Für die Liste eignen sich z.B. die Javaklassen Vector oder ArrayList. Informiere dich im Handbuch und in der Javadokumentation über die Methoden dieser Klasse . c) Schreibe eine Methode, die nach Eingabe von 𝑛 die Formel für 𝑎+𝑏 𝑛 ausgibt. Informatik 11 – 2. Die rekursive Datenstruktur Baum – 2.2 Suchen und Einfügen