Traversierung ● Traversierung: bezeichnet verschiede Verfahren einer Routenbestimmung durch baumförmige Graphen ● Dabei wird jeder Knoten und jede Kante nur einmal besucht ● Traversierungsalgorithmen sind für die effiziente Durchwanderung von Bäumen unerlässlich ● Es gibt vier Traversierungsmethoden Datenstrukturen Teil 3 Traversierung und AVLBäume Traversierung ● Pre-Order / Hauptreihenfolge Traversierung ● In-Order / Symmetrische Reihenfolge – Ausgehend von der Wurzel wird zunächst der linke Teilbaum abgearbeitet, danach der rechte – Hier wird zunächst der linke Teilbaum betrachtet, danach die Wurzel und zuletzt der rechte Teilbaum – Dabei wird für jeden Teilbaum der Algorithmus rekursiv aufgerufen – Ebenfall rekursive Abarbeitung Traversierung ● Post-Order / Nebenreihenfolge Traversierung ● Level-Order – Hierbei wird zunächst der linke Teilbaum, dann der rechte Teilbaum und dann die Wurzel betrachtet – Ausgehend von der Wurzel werden alle Elemente nebeneinander (quasi von links nach rechts) abgearbeitet – Ebenfalls rekursiv – Diese Methode ist die rechenintensivste, da immer wieder zu Vorgängerknoten zurückgegangen werden muß Beispiel für Traversierungen ● Pre-Order – Beispiel für Traversierungen ● In-Order Ergebnis: 30 15 7 9 36 34 32 35 41 – Ergebnis: 7 9 15 30 32 34 35 36 41 Beispiel für Traversierungen ● Post-Order – AVL-Bäume ● Spezielle Binärbäume ● Benannt nach Adel´son-Vel´skii und Landis ● Per Definition darf sich die Tiefe (Höhe) eines linken Teilbaums maximal um 1 von der Tiefe (Höhe) eines rechten Teilbaums unterscheiden. ● Daher ist der Baum immer maximal balanciert Ergebnis: 9 7 15 32 35 34 41 36 30 AVL-Bäume ● Dies wird durch spezielle Algorithmen für das Einfügen und Löschen von Knoten erreicht ● Hierzu wird für jeden Knoten der Wert „Balance“ mitgespeichert ● Dieser beinhaltet die Tiefendifferenz der jeweiligen Teilbäume ● Ist die Differenz größer als 1 oder kleiner als -1, so wird jeweils ein bestimmter Algorithmus ausgelöst ● Dieser heißt Rotation AVL-Bäume ● Beispiel AVL-Bäume, Rotation ● ● Es gibt vier Rotationsarten – Linksrotation – Rechtsrotation – LinksRechtsrotation – RechtsLinksRotation ● Linksrotation Vorteil der AVL-Bäume – ● Rotation Beispiele Immer Balanciert, dadurch minimale Suchschrittanzahl Nachteil der AVL-Bäume – Einfügen und Löschen sind komplex und langsam Rotation Beispiele ● Rechtsrotation Rotation Beispiele ● RechtsLinksrotation Rotation Beispiele ● LinksRechtsrotation AVL-Bäume, Rotation ● ● Unterteilung in – Einfachrotation: Links- / Rechtsrotation – Doppelrotation: LinksRechts- / RechtsLinksrotation Einfachrotation immer dann, – ● Doppelrotation immer dann, – Beispiel Einfachrotation wenn durch Einfügen oder Löschen ein Höhenunterschied > 1 an einem der beiden äußersten Teilbäume eines Zweiges eines AVL-Baumes ergibt wenn der Höhenunterschied an inneren Teilbäumen auftritt Beispiel Doppelrotation Löschen im AVL-Baum ● Einfügen benötigt maximal eine Rotation. ● Löschen komplexer, da auf dem Pfad zur Wurzel ggf. mehrere Rotationen erforderlich sind. ● Strategie: – Löschen wird wie bei natürlichen Suchbäumen auf das Löschen von Randknoten (d.h. Knoten mit höchstens einem Nachfolger) zurückgeführt. – D.h. beim Löschen eines Knotens mit zwei nichtleeren Unterbäumen ("innerer Knoten") wird der „größte linke“ oder der „kleinste rechte“ Knoten verwendet. – Der Balancefaktor im Unterbaum des gelöschten Randknotens muß angepaßt werden. – Der Balancefaktor auf allen Knoten im Pfad zur Wurzel muß (rekursiv) überprüft und angepaßt werden. Löschen im AVL-Baum Löschen im AVL-Baum Löschen im AVL-Baum Löschen im AVL-Baum Löschen im AVL-Baum ● Mögliche Fälle beim Löschen sind entsprechend der Rotation und Doppelrotation beim Einfügen: Löschen entspricht sozusagen dem Einfügen im gegenüberliegenden Unterbaum ● ACHTUNG: Manchmal kann man sich nach dem Löschen zwischen einfacher und doppelter Rotation entscheiden! ● ABER: Bei jedem Fall muß überprüft werden, ob sich die Höhe des betrachteten AVL (Unter-)Baums gegenüber der Höhe vor dem Löschen ändert – Falls ja: Rebalancierung rekursiv auf Elternknoten aufrufen – Falls nein: fertig.