Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:adt:baeume:breitensuche:start [14.02.2022 14:21] – sbel | faecher:informatik:oberstufe:adt:baeume:breitensuche:start [18.01.2024 07:31] (aktuell) – [Suche im Baum] Marco Kuemmel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Levelorder Traversierung, | ====== Levelorder Traversierung, | ||
- | Bei den drei rekursiv implementierbaren Traversierungen wird der Baum zuerst in die Tiefe durchwandert bis hin zu seinen Blättern (" | + | Bei den drei rekursiv implementierbaren Traversierungen wird der Baum zuerst in die Tiefe durchwandert bis hin zu seinen Blättern (" |
- | {{ : | + | {{ : |
Bei der Levelorder Traversierung werden auf jedem Niveau des Baums erst alle Knoten besucht, bevor auf das nächste Niveau gewechselt wird, in unserem Beispielbaum ergibt sich damit die Traversierungsreihenfolge: | Bei der Levelorder Traversierung werden auf jedem Niveau des Baums erst alle Knoten besucht, bevor auf das nächste Niveau gewechselt wird, in unserem Beispielbaum ergibt sich damit die Traversierungsreihenfolge: | ||
- | ===== Suche in Bäumen ===== | + | In diesem Wiki-Abschnitt wollen wird zunächst die Rekursiven Traversierungen iterativ umschreiben, |
+ | ===== Iterative Traversierung ===== | ||
+ | Die rekursiven Implementationen der Traversierungen versagen ihren Dienst, wenn die Bäume zu tief werden, da der Call-Stack für die Rekursion nicht beliebig wachsen kann. Bei Java ist seine Größe auf ca. 256kB beschränkt, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Die einfachste Lösung für dieses Problem ist es, den Stack, in dem man darüber Buch führt, welche Knoten des Baums als nächstes zu bearbeiten sind, selbst zu verwalten: | ||
+ | |||
+ | ==== Von der Rekursion zur Iteration ==== | ||
+ | Die folgende Tabelle stellt den rekursiven Pseudocode zur Ermittlung der Knotenzahl einer iterativen Variante gegenüber. | ||
+ | ^Rekursiv ^ Iterativ ^ | ||
+ | |< | ||
+ | falls b == null: | ||
+ | return 0 | ||
+ | sonst: | ||
+ | t1 = anzahl(b.links) | ||
+ | t2 = anzahl(b.rechts) | ||
+ | return 1 + t1 + t2</ | ||
+ | todo = new Stack | ||
+ | todo.push(b) | ||
+ | zaehler = 0 | ||
+ | solange todo nicht leer: | ||
+ | tmp = todo.pop() | ||
+ | zaehler++ | ||
+ | falls tmp.rechts != null: | ||
+ | todo.push(tmp.rechts) | ||
+ | falls tmp.links != null: | ||
+ | todo.push(tmp.links) | ||
+ | return zaehler</ | ||
+ | |||
+ | Während die rekursive Variante die Verwaltung der noch zu bearbeitenden Knoten dem Aufrufstack der Rekursion überlässt, | ||
+ | |||
+ | ===== Suche im Baum ===== | ||
+ | |||
+ | {{: | ||
+ | === (A1) Tiefensuche | ||
+ | |||
+ | Arbeite mit der folgenden Bluej-Vorlage: | ||
+ | |||
+ | <WRAP center round tip 95%> | ||
+ | Du kannst in der Klasse " | ||
+ | </ | ||
+ | |||
+ | |||
+ | * Implementiere zunächst den Stack, so dass du anschließend die Knoten des Baums verwalten kannst. Schlage, wenn nötig, auf den [[faecher: | ||
+ | * Implementiere dann eine iterative Traversierung des Baums. Gelingt es dir, Pre-, In- und Postorder Traversierung zu implementieren? | ||
+ | * Erweitere deine Traversierung zu einer Tiefensuche, | ||
+ | * einen Knoten eines bestimmten Wertes findet | ||
+ | * den ersten Knoten findet, dessen Wert zwischen den an die Suchmethode zu übergebenden Parametern '' | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | === (A2) Breitensuche | ||
+ | |||
+ | * Implementiere zunächst die nötige Queue, so dass du anschließend die Knoten des Baums verwalten kannst. Schlage, wenn nötig, auf den [[faecher: | ||
+ | * Implementiere dann die Level-Order-Traversierung des Baums. Gelingt es dir, die Traversierung von links nach rechts und andersherum zu implementieren? | ||
+ | * Erweitere deine Traversierung zu einer Breitensuche, | ||
+ | * einen Knoten eines bestimmten Wertes findet | ||
+ | * den ersten Knoten findet, dessen Wert zwischen den an die Suchmethode zu übergebenden Parametern '' | ||
+ | ===== Material ===== | ||
+ | |||
{{simplefilelist> | {{simplefilelist> | ||