MINT lernen

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: Preorder W – L – R · Inorder L – W – R · Postorder L – R – W. Links wird immer vor rechts besucht; nur die Stelle der Wurzel wandert.

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 (ab 5.3.3) 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.
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