Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:informatik:oberstufe:adt:baeume:breitensuche:start [14.02.2022 20:12] – [Suche im Baum] sbel | faecher:informatik:oberstufe:adt:baeume:breitensuche:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Levelorder Traversierung, | ||
- | |||
- | 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: | ||
- | |||
- | ===== 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 ===== | ||
- | |||
- | |||
- | Arbeite mit der folgenden Bluej-Vorlage: | ||
- | |||
- | * Implementiere zunächst den Stack. Schlage wenn nötig auf den [[faecher: | ||
- | ===== Material ===== | ||
- | |||
- | {{simplefilelist> | ||
- | |||
- | |||