====== Binäre Suchbäume ======
**Binäre Suchbäume** (auch: **sortierte Binärbäume** oder **geordnete Binärbäume**) sind Binärbäume, die zusätzlich **sortiert** (bzgl. eines bestimmten Merkmals, z.B. Größe) sind:
Die Inhalte der **linken Nachfolger** eines Knotens sind dabei **immer** (bzgl. der gewählten Ordnung) **kleiner** und die Inhalte der **rechten** Nachfolger sind **immer größer** **als** der Inhalt des **aktuellen Knotens**.
Dazu ist in der Inhaltsklasse zusätzlich eine Methode ''größerAls'' notwendig, die den Rückgabewert ''true'', besitzt, falls das aktuelle Objekt größer als das übergebene Objekt ist und ansonsten ''false'':
public boolean größerAls(Inhalt i)
[[.groesserals|Hier beispielhafte Implementierungen der Methode ''größerAls''.]]
Ein binärer Suchbaum mit ''int''-Werten könnte folgenden Aufbau haben:
{{ :binsuchbaum:pasted:20241018-075651.png?800 }}
===== Implementierung =====
===== Aufgabe 1 =====
Ergänze den binären Suchbaum um folgende Methoden:
* Anzahl der enthaltenen Elemente (Methode ''int anzahl()'')
* Prüfung, ob ein bestimmtes Element enthalten ist (Methode ''boolean istEnthalten(int n)'')
[[.aufgabe1:loesung|Hier geht's zur Lösung!]]
===== Traversierung (Durchlaufen) des Baumes =====
Zum Durchlaufen (Traversierung) eines binären Suchbaums sind verschiedene Varianten üblich. An dieser Stelle werden beispielhaft drei bedeutende Varianten genannt:
==== InOrder ====
Es wird rekursiv zuerst der linke Teilbaum durchlaufen, dann der aktuelle Knoten besucht und anschließend der rechte Teilbaum.
==== PreOrder ====
Es wird zuerst der aktuelle Knoten besucht, dann werden rekursiv der linke und der rechte Teilbaum durchlaufen.
==== PostOrder ====
Es wird zuerst rekursiv der linke Teilbaum, dann der rechte Teilbaum durchlaufen und dann der aktuelle Knoten besucht.
==== Beispiel ====
{{ :binsuchbaum:pasted:20241018-075750.png }}
^InOrder ^PreOrder ^PostOrder ^
|Archäologie |Informatik |Archäologie|
|Biologie |Biologie| Chinesisch|
|Chemie |Archäologie| Chemie|
|Chinesisch |Chemie |Biologie |
|Informatik |Chinesisch |Latein |
|Latein |Mathematik |Sport |
|Mathematik |Latein |Spanisch |
|Spanisch |Spanisch |Mathematik |
|Sport |Sport |Informatik |
**Aufgabe 2** \\ \\
Ergänze den binären Suchbaum um die Methoden
* ''void traversePreOrder()''
* ''void traversePostOrder()''
[[.aufgabe2a:loesung|Hier geht's zur Lösung!]]
===== Höhe des Binärbaums =====
{{ :binsuchbaum:definition_ebenen.svg}}
Als **Höhe** des Binärbaumes bezeichnet man die Anzahl der enthaltenen "Ebenen", d.h. die maximale Anzahl der Ebenen von der Wurzel bis zu einem Abschluss. Ein vollständig gefüllter Binärbaum der Höhe $n$ hat $2^n - 1$ Elemente. \\
Ein Binärbaum mit möglichst wenigen Ebenen heißt **balancierter Binärbaum**. \\ \\
Der Baum rechts hat die Höhe 3.
**Aufgabe 3:** \\ \\
Ermittle, wie viele Ebenen ein balancierter binärer Suchbaum mit
* 12
* 1500
* 10 000 000 000
Elementen besitzt. \\ \\
[[.hoehe:loesung|Hier geht's zur Lösung!]]
**Aufgabe 4:** \\ \\
{{ :binsuchbaum:pasted:20241018-075825.png?500}}
Gib die Traversierung des rechts dargestellten Baumes
* InOrder
* PreOrder
* PostOrder
an. \\ \\
[[.traversierung1:loesung|Hier geht's zur Lösung!]]
**Aufgabe 5:** \\ \\
Gib einen binären Suchbaum an (als Text oder als Grafik, z.B. mit UMLet), der folgende Ausgabereihenfolge erzeugt:
* preOrder: 39, 20, 18, 10, 51, 93, 64, 77, 97
* postOrder: 10, 18, 20, 77, 64, 97, 93, 51, 39 \\ \\
[[.traversierung2:loesung|Hier geht's zur Lösung!]]
**Aufgabe 6:** \\ \\
In einen (leeren) binären Suchbaum sollen folgende Einträge eingefügt werden: \\ \\
15, 46, 1, 28, 100, 99, 3
Gib jeweils eine Einfügereihenfolge an, bei der der binäre Suchbaum maximale (d.h. 7) bzw. minimale (d.h. 3) Höhe hat. Finde eine allgemeine Strategie für die minimale Höhe.
\\ \\
[[.traversierung3:loesung|Hier geht's zur Lösung!]]
**Aufgabe 7:** \\
Erstelle eine Methode ''public int hoehe()'', die die Höhe des binären Suchbaums zurückgibt. \\ \\
[[.aufgabehoehe:start|Hier geht's zur Lösung!]]