MINT lernen

Typische Fehler — was oft schiefgeht

Die zwölf häufigsten Fehler von DynArray bis Suchbaum — mit Richtigstellung.

!

Die 12 häufigsten Fehler

1Das letzte Element wird an Index getLength() gesucht

So wird es oft gemacht: l.getItem(l.getLength())

Richtig ist: l.getItem(l.getLength() - 1) — die Zählung beginnt bei 0.

Letzter Index = Länge minus 1.

2Beim Löschen vorwärts wird ein Element übersprungen

So wird es oft gemacht: Vorwärts-for mit delete(i) auf [1, 1, 5] ergibt [1, 5].

Richtig ist: Rückwärts laufen: aus [1, 1, 5] wird [5].

Löschen in der Schleife: von hinten nach vorn.

3pop und top werden verwechselt

So wird es oft gemacht: Zweimal top() liefert nacheinander die beiden obersten Elemente.

Richtig ist: top() liefert zweimal dasselbe; erst pop() entnimmt.

pop entnimmt, top schaut nur.

4LIFO und FIFO werden vertauscht

So wird es oft gemacht: Für die Warteschlange an der Hotline wird ein Stapel gewählt.

Richtig ist: Wer zuerst anruft, wird zuerst bedient: FIFO, also eine Schlange.

Stapel = neuestes zuerst, Schlange = ältestes zuerst.

5getItem() auf einem leeren Baum

So wird es oft gemacht: if (x == b.getItem()) … als erste Zeile einer rekursiven Suche.

Richtig ist: Zuerst if (b.isEmpty()) return false; — erst danach getItem().

Erst isEmpty(), dann getItem().

6isLeaf() statt isEmpty() als Abbruch

So wird es oft gemacht: if (b.isLeaf()) return; als einziger Abbruch einer Traversierung.

Richtig ist: Abbruch beim leeren Baum: if (b.isEmpty()) return; — sonst fehlen Blätter oder es entsteht ein Laufzeitfehler bei Knoten mit nur einem Kind.

Rekursion endet am leeren Baum, nicht am Blatt.

7Höhe und Tiefe werden verwechselt

So wird es oft gemacht: Ein Baum aus Wurzel und zwei Blättern hat die Höhe 1.

Richtig ist: Hier zählt die Höhe Ebenen: Höhe 2. Die Blätter haben die Tiefe 1.

Höhe = Ebenen, Tiefe = Kanten ab der Wurzel.

8Preorder wird Ebene für Ebene gelesen

So wird es oft gemacht: Für 1(2(4, 5), 3) wird die Preorder 1 2 3 4 5 notiert.

Richtig ist: Nach der Wurzel erst ganz in den linken Teilbaum: 1 2 4 5 3.

Preorder: W, dann der ganze linke Teilbaum.

9Die Suchbaum-Eigenschaft wird nur für Kinder geprüft

So wird es oft gemacht: 8(3(1, 9), 12) gilt als Suchbaum, weil 9 > 3 rechts von 3 steht.

Richtig ist: Die 9 liegt im linken Teilbaum von 8 und müsste kleiner als 8 sein — kein Suchbaum.

Die Ordnung gilt für ganze Teilbäume.

10Ein neuer Wert wird oben eingeschoben

So wird es oft gemacht: In 40(20, 60) wird 30 „zwischen 40 und 20“ eingefügt.

Richtig ist: 30 wandert den Suchpfad hinab und wird Blatt: rechtes Kind von 20.

Eingefügt wird immer als Blatt.

11Das Ergebnis der Rekursion wird nicht zurückgegeben

So wird es oft gemacht: if (x < b.getItem()) enthaelt(b.getLeft(), x);

Richtig ist: if (x < b.getItem()) return enthaelt(b.getLeft(), x); — sonst geht das Ergebnis verloren.

Rekursiver Aufruf mit return weiterreichen.

12Ein neuer Baum wird nur der Variablen zugewiesen

So wird es oft gemacht: if (b.isEmpty()) b = new BinTree<Integer>(x);

Richtig ist: b.setItem(x); — die Zuweisung ändert nur die lokale Variable, der leere Teilbaum im Baum bleibt leer.

Leeren Teilbaum mit setItem füllen.