faecher:informatik:oberstufe:adt:baeume:breitensuche:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:adt:baeume:breitensuche:start [14.02.2022 16:15] – [Iterative Traversierung] sbelfaecher:informatik:oberstufe:adt:baeume:breitensuche:start [18.01.2024 07:31] (aktuell) – [Suche im Baum] Marco Kuemmel
Zeile 1: Zeile 1:
 ====== Levelorder Traversierung, Iterative Tiefensuche ====== ====== Levelorder Traversierung, Iterative Tiefensuche ======
  
-Bei den drei rekursiv implementierbaren Traversierungen wird der Baum zuerst in die Tiefe durchwandert bis hin zu seinen Blättern ("Tiefensuche") - hier noch einmal am Beispiel bei der Preorder-Traversierung:+Bei den drei rekursiv implementierbaren Traversierungen wird der Baum zuerst in die Tiefe durchwandert bis hin zu seinen Blättern ("Tiefensuche"). Manchmal möchte man aber einen Baum auf jedem Level von links nach rechts (oder andersherum) durchlaufen, also Level für Level. Das nennt man "Level-Order-Traversierung":
  
-{{ :faecher:informatik:oberstufe:adt:baeume:traversierungen:hinweise_traversierung:preorder.gif |}}+{{ :faecher:informatik:oberstufe:adt:baeume:breitensuche:levelorder.gif |}}
  
 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: ''A->B->F->C->D->G->E''. Der Algorithmus zur Levelorder Traversierung ist nicht rekursiv. 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: ''A->B->F->C->D->G->E''. Der Algorithmus zur Levelorder Traversierung ist nicht rekursiv.
 +
 +In diesem Wiki-Abschnitt wollen wird zunächst die Rekursiven Traversierungen iterativ umschreiben, um uns anschließend zu überlegen, wie man die Level-Order-Traversierung (oder **Breitensuche**) implementiert.
  
 ===== Iterative Traversierung ===== ===== Iterative Traversierung =====
Zeile 13: Zeile 15:
 {{ :faecher:informatik:oberstufe:adt:baeume:breitensuche:stackoverflow.png |}} {{ :faecher:informatik:oberstufe:adt:baeume:breitensuche:stackoverflow.png |}}
  
-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.+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 ^ ^Rekursiv ^ Iterativ ^
 |<code>anzahl(b: Binaerbaum):  |<code>anzahl(b: Binaerbaum): 
Zeile 35: Zeile 39:
   return zaehler</code>|   return zaehler</code>|
  
 +Während die rekursive Variante die Verwaltung der noch zu bearbeitenden Knoten dem Aufrufstack der Rekursion überlässt, implementiert die iterative Variante einen eigenen "todo"-Stack mit, dem die den in den nächsten Schritten zu verarbeitenden Knoten verwaltet werden.
 +
 +===== Suche im Baum =====
 +
 +{{:aufgabe.png?nolink  |}}
 +=== (A1) Tiefensuche  ===
 +
 +Arbeite mit der folgenden Bluej-Vorlage: https://codeberg.org/qg-info-unterricht/binaerbaum-iterativ
 +
 +<WRAP center round tip 95%>
 +Du kannst in der Klasse "Testbaeume" anpassen, welche Baumdefinitionen geladen werden sollen: Entweder 100 "große" Bäume oder 5 "kleine" Bäume.
 +</WRAP>
 +
 +
 +  * Implementiere zunächst den Stack, so dass du anschließend die Knoten des Baums verwalten kannst. Schlage, wenn nötig, auf den [[faecher:informatik:oberstufe:adt:stack:linkedstack:start|entsprechenden Wiki-Seiten]] nach.
 +  * Implementiere dann eine iterative Traversierung des Baums. Gelingt es dir, Pre-, In- und Postorder Traversierung zu implementieren? Mit den "kleinen" Bäumen kannst du die Traversierungen gut nachvollziehen.
 +  * Erweitere deine Traversierung zu einer Tiefensuche, die 
 +    * einen Knoten eines bestimmten Wertes findet
 +    * den ersten Knoten findet, dessen Wert zwischen den an die Suchmethode zu übergebenden Parametern ''low'' und ''high'' liegt.
 +
 +---- 
 +{{:aufgabe.png?nolink  |}}
 +=== (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:informatik:oberstufe:adt:queue:start|entsprechenden Wiki-Seiten]] nach. Du kannst auch den vorhandenen Code für den Stack nutzen. 
 +  * Implementiere dann die Level-Order-Traversierung des Baums. Gelingt es dir, die Traversierung von links nach rechts und andersherum zu implementieren? Mit den "kleinen" Bäumen kannst du die Traversierungen gut nachvollziehen.
 +  * Erweitere deine Traversierung zu einer Breitensuche, die 
 +    * einen Knoten eines bestimmten Wertes findet
 +    * den ersten Knoten findet, dessen Wert zwischen den an die Suchmethode zu übergebenden Parametern ''low'' und ''high'' liegt.
 +===== Material =====
 + 
 {{simplefilelist>.:*}} {{simplefilelist>.:*}}
  
  
  
  • faecher/informatik/oberstufe/adt/baeume/breitensuche/start.1644855331.txt.gz
  • Zuletzt geändert: 14.02.2022 16:15
  • von sbel