Diese Routine ist nicht nur rekursiv, sondern sogar rechtsrekursiv. Darunter verstehen wir das folgende:PROCEDURE lookup(k: keytype; b: stree): stree; BEGIN IF b = NIL THEN RETURN NIL ELSIF k < b^.key THEN RETURN lookup(k, b^.left); ELSIF k > b^.key THEN RETURN lookup(k, b^.right); ELSE (* k = b^.key *) RETURN b; END; END lookup;
So elegant unser Verfahren auch ist, gibt es doch ein paar Probleme. Wenn man die Daten zufällig in aufsteigender Folge der Schlüssel einträgt, so entartet der Baum zu einer linearen Kette, und damit wird das Eintragen und Suchen mit (n) unangenehm langsam; es gibt noch andere Eingabefolgen mit dieser Eigenschaft. Beim Eintragen in zufälliger Reihenfolge geschieht dies zwar nicht; dann haben wir Aufwand (log n). Aber wenn man die schlimmsten Fälle unbedingt vermeiden will, so muß man zusätzliche Information im Baum mitführen, etwa die Höhe oder die Knotenzahl der Teilbäume, und notfalls den Baum gelegentlich reorganisieren. Die Einzelheiten davon und geeignete Varianten (2-3-Bäume, AVL-Bäume) gehören in eine Vorlesung über Datenstrukturen.