MINT üben

Pre-, In- und Postorder

Derselbe Rundweg um den Baum — und doch drei verschiedene Reihenfolgen.

1

Jeden Knoten genau einmal besuchen

Eine Reihung durchläuft man mit einer Zählschleife von vorn nach hinten. Ein Baum hat kein „vorn“ und „hinten“ — man muss festlegen, wann die Wurzel an der Reihe ist.

  • Traversierung:jeden Knoten eines Baums genau einmal verarbeiten, z. B. ausgeben.
  • Preorder:W – L – R: erst die Wurzel, dann linker, dann rechter Teilbaum.
  • Inorder:L – W – R: die Wurzel steht zwischen den beiden Teilbäumen.
  • Postorder:L – R – W: die Wurzel kommt ganz zum Schluss.
  • Umrundung:Man fährt den Baum links herum ab und berührt jeden Knoten dreimal: links, unten, rechts.

Starte die Umrundung mit ▶ oder ziehe den violetten Schieber auf dem Band. Das Band ist die abgewickelte Umrundung: blau = links am Knoten vorbei, grün = unten, orange = rechts. Wähle die Reihenfolge — die Ausgabe sammelt genau die Berührungen dieser Farbe.

Umrundung abwickeln

Halte fest: Alle drei Traversierungen laufen denselben Weg um den Baum. Sie unterscheiden sich nur darin, bei welcher der drei Berührungen ein Knoten ausgegeben wird.

Merke

Traversierung: Jeder Knoten wird genau einmal verarbeitet. Preorder W – L – R · Inorder L – W – R · Postorder L – R – W. Links wird immer vor rechts besucht; nur die Stelle der Wurzel wandert.

Umrundung: Man fährt den Baum links herum ab und berührt jeden Knoten dreimal (links, unten, rechts); die Ordnungen unterscheiden sich nur darin, bei welcher Berührung ausgegeben wird.

2

Rekursiv traversieren

Die Definition des Binärbaums ist rekursiv — deshalb ist es die Traversierung auch: Teilbäume werden mit derselben Methode bearbeitet.

  • Abbruch:Der leere Baum wird nicht bearbeitet — die Methode tut dann nichts.
  • Rekursionsschritt:Wurzel verarbeiten und beide Teilbäume rekursiv traversieren — in der gewählten Reihenfolge.
  • Nur eine Zeile wandert:Für Inorder steht die Ausgabe zwischen den beiden Aufrufen, für Postorder nach beiden.
static void preorder(BinTree<String> b) {
    if (!b.isEmpty()) {
        System.out.print(b.getItem() + " ");   // W: Wurzel verarbeiten
        preorder(b.getLeft());                 // L: linken Teilbaum
        preorder(b.getRight());                // R: rechten Teilbaum
    }
}
// Baum 1 aus dem Applet — preorder: M F B K H S W
//                          inorder:  B F H K M S W
//                          postorder: B H K F W S M
  • Preorder nutzen:Baum kopieren oder mit Struktur ausgeben — die Wurzel muss zuerst da sein.
  • Inorder nutzen:Im Suchbaum liefert sie alle Werte sortiert.
  • Postorder nutzen:Rechenbaum auswerten oder Baum löschen — erst die Teilbäume, dann die Wurzel.
Herleitung:
\(2n\)
Plätze
Jeder der n Knoten hat zwei Plätze für Teilbäume: links und rechts.
\(2n-(n-1)=n+1\)
leere Bäume
Jeder Knoten außer der Wurzel belegt genau einen Platz. Die übrigen Plätze halten einen leeren Baum.
\(A=n+(n+1)=2n+1\)
Ergebnis
Die Traversierung wird für jeden Knoten und jeden leeren Baum genau einmal aufgerufen: bei 7 Knoten 15 Aufrufe. Der Aufwand wächst linear mit n.
Merke

Rekursive Traversierung: Abbruch beim leeren Baum (nichts tun); sonst Wurzel verarbeiten und beide Teilbäume mit derselben Methode traversieren.

Reihenfolge: Nur eine Zeile wandert — bei Inorder steht die Ausgabe zwischen den beiden Aufrufen, bei Postorder nach beiden.

Einsatz: Preorder zum Kopieren, Inorder liefert im Suchbaum alle Werte sortiert, Postorder zum Auswerten eines Rechenbaums oder Löschen.

\(A=n+(n+1)=2n+1\)

3

Allgemeine Hinweise

Nicht Ebene für Ebene

Preorder liest den Baum nicht zeilenweise von oben nach unten. Nach der Wurzel geht es erst ganz in den linken Teilbaum hinab.

Abbruch vergessen

Fehlt die Prüfung isEmpty(), ruft die Methode getItem() auf einem leeren Baum auf — Laufzeitfehler statt Ausgabe.

Schnell von Hand

Zeichne die Umrundung und setze an jeden Knoten einen Punkt links (Pre), unten (In) oder rechts (Post). Dann nur noch die Punkte in Laufrichtung ablesen.

Videos