Algorithmen und Datenstrukturen Binäre Bäume Zum Speichern und Suchen von Daten werden häufig Baumstrukturen verwendet • Abspeichern von n Datenobjekten in einer Baumstruktur • Ablegen von Daten ist in O(log(n)) möglich • Auffinden von Daten ist ebenfalls in O(log(n)) möglich • Nachteil: • die entstehende Struktur ist von der Reihenfolge der Eingangsdaten abhängig • ggf. ist eine Reorgansisation der Baumstruktur notwendig Bäume (1/2) • Wir betrachten hier speziell Wurzelbäume, d.h. zykelfreie Graphen mit einem ausgezeichneten Knoten, der Wurzel. w k k b k b w: Wurzel k: Knoten b: Blatt k b b Bäume (2/2) • Wir werden hier binäre Bäume betrachten. D.h. • • Jeder Knoten hat höchstens zwei Nachfolger Die Tiefe eines Baumes ist der längste vorhandene Weg von der Wurzel zu einem Blatt • Jeder binäre Baum der Tiefe n hat höchstens (2n -1) Knoten Fibonacci Bäume • Ein Baum heißt Fibonacci Baum, genau dann, wenn • Der linke Ast (Sohn) der Wurzel ist ein Fibonacci Baum der Höhe h-1 • Der rechte Ast (Sohn) der Wurzel ist eine Fibonacci Baum der Höhe h-2 • Der leere Baum ist ein Fibonacci Baum der Höhe 0 • Ein Baum, der aus nur einem Knoten (der Wurzel) besteht ist ein Fibonacci Baum der Höhe 1 5 Beispiel (1/2) • Einfügen ganzer Zahlen in eine Baumstruktur mit folgender Regel • kleinere Werte im linken Teilbaum abspeichern • größere Werte im rechten Teilbaum abspeichern • Eingegeben werden die Zahlenfolgen • 8,4,9,2,3,6,7,1,5 • 1,2,3,4,5,6,7,8,9 6 Beispiel (2/2) 1 8 2 4 9 4 2 1 3 6 3 5 7 9 Suchbäume Wie das Beispiel zeigt können Suchbäume zu Listen „entarten“ • Lösungsansätze: • Strukturanforderung an Suchbäume • Bei Verletzung dieser Anforderungen ist eine Reorganisation des Baums notwendig • Die Anforderung, daß in jedem Knoten der linke und rechte Teilbaum gleich tief sind ist zu streng, da zu hoher Reorganisationsaufwand, bzw. nicht erfüllbar • Daher die Forderung: Tiefendifferenz höchstens 1 AVL Bäume Ein binärer Suchbaum heißt AVL Baum, wenn für jeden Knoten v im Baum gilt, daß die Differenz der Höhe des rechten Teilbaums und der des linken Teilbaums höchstens 1 beträgt. Es wird also gefordert, daß balance(v) = heigth(v.left) - heigth(v.right)∈{-1, 0, 1} gilt. Derartige Bedingungen nennt man auch Strukturinvariante AVL : Adelson-Velski und Landis, die Namen der „Erfinder dieser Struktur“ Beispiel AVL Bäume der Höhe 1 und 2 mit maximaler Blattanzahl w w k b k b b b b b Anzahl der Blätter in AVL Bäumen • Sei Fi die i-te Fibonacci Zahl, d.h es ist • Fi+2 = Fi + Fi+1 mit F0 = 0 und F1 = 1 • So hat ein AVL Baum mit Höhe h mindestens Fh+2 Blätter. Es ist Beispiele AVL Bäume 8 8 4 2 9 3 6 AVL Baum 4 2 9 3 AVL Baum 8 8 4 4 2 AVL Baum 3 3 kein AVL Baum Beispiel mit Restrukturierung (1/2) Einfügeoperation kein AVL Baum 8 „2“ einfügen 8 4 4 4 2 8 2 AVL Baum Reorganisation AVL Baum Beispiel mit Restrukturierung (1/2) Löschoperation kein AVL Baum AVL Baum 2 3 8 8 3 AVL Baum 3 9 4 „9“ löschen 2 2 4 4 8 Reorganisation Rotationen • Zur Restrukturierung von Bäumen, die der Höhenbedingung nicht mehr genügen werden sogenannte Rotationen durchgeführt. • Zielsetzung: Herstellung der Strukturbedingung • Aufwand zur Restrukturierung sollte möglichst gering sein Rotationen • x y A h-1 • B C h-1 h Datenelemente in A haben einen kleineren Schlüsselwert als x Alle Datenelemente in B haben einen kleineren Schlüsselwert als y Alle Datenelemente in C haben einen größeren Schlüsselwert als y Rotationen x y y x A C h-1 B A B h-1 h-1 C h-1 h h Warum Rotation? Was rotiert? t = Zx Zeiger rotieren! x ZA y Zy Zx ZC y ZB x ZC A h-1 ZA ZB B C C A B h-1 h-1 h-1 h h Strukturverletzung innerer Teilbäume x y z x z A y A C B1 B2 B1 B2 C Beispiel: Löschen in Bäumen 5 5 3 8 2 4 7 10 6 1 8 2 9 3 1 9 11 5 2 2 7 3 10 6 11 5 1 7 6 1 10 9 11 10 3 7 11 9 Aufwand der Reorganisation • Beim Einfügen kann eine Rotation (um einen oder zwei Knoten) erforderlich sein. • Beim Löschen kann jeder Knoten entlang des Suchpfades erforderlich sein • Empirische Ergebnisse. Notwendigkeit der Rotation • bei jedem zweiten Einfügen • bei jedem fünften Löschen • Löschen und Einfügen ist bei AVL-Bäumen im Mittel gleichaufwendig Traversieren von Bäumen Es gibt unterschiedliche Verfahren, die Knoten eines Baumes (als Weg im Graphen) zu besuchen. Bei binären Bäumen unterscheidet man • Preorder • • Inorder • • Wurzel, linker Teilbaum, rechter Teilbaum linker Teilbaum, Wurzel, rechter Teilbaum Postorder • linker Teilbaum, rechter Teilbaum, Wurzel Beispiel Inorder Vorgehensweise Traversiere linken Teilbaum (in Inorder) Wurzel Traversiere rechten Teilbaum (in Inorder) Bei der Inorder-Traversierung werden die Inhalte in sortierter Reihenfolge ausgegeben, falls es sich um einen binären Suchbaum handelt 5 2 1 10 3 7 11 9 Traversierung in Inorder: 1, 2, 3, 5, 7, 9, 10, 11 Beispiel Preorder Vorgehensweise Wurzel Traversiere linken Teilbaum (in Preorder) Traversiere rechten Teilbaum (in Preorder) 5 2 1 10 3 7 11 9 Traversierung in Preorder: 5, 2, 1, 3, 10, 7, 9, 11 Beispiel Postorder Vorgehensweise Traversiere linken Teilbaum (in Postorder) Traversiere rechten Teilbaum (in Postorder) Wurzel 5 2 1 Traversierung in Postorder: 1, 3, 2, 9, 7, 11, 10, 5 10 3 7 11 9 UPN: Umgekehrte Polnische Notation • Bei einigen Taschenrechnern (insb. hp) werden arithmetische Ausdrücke in Postorder eingegeben. • Dieses Verfahren heißt umgekehrte, polnische Notation. Vorteile: • Es werden keine Klammern benötigt • man braucht weniger Tastendrücke als mit „herkömmlichen“ Taschenrechnern Beispiel Der arithmetischer Ausdruck: 3*(7-2) + 4 hat den Ableitungsbaum: + * 4 - 3 7 2 Durchlauf in Postorder: 3, 7, 2, - * 4 + Arithmetische Ausdrücke in Postorder • Gegeben 3*x-1 • Eingabe in UPN: 3 x * 1 - • Gegeben: 3*(4+x*(2-x))) • Eingabe in UPN: 2 x - x * 4 + 3 * • Es besteht ein Zusammenhang mit dem Durchlaufen eines Ableitungsbaums für arithmetische Ausdrücke bei geeigneter Grammatik Levelorder • Traversierungsreihenfolge • Besuch der Knoten eines Baumes „schichtenweise“ • Besuche zuerst die Wurzel • danach die Wurzel des linken Teilbaums und die Wurzel des rechten Teilbaums • u.s.w Beispiel Levelorder Traversierung in Levelorder: 5 Wurzel Wurzel linker Teilbaum 2 1 10 3 7 11 9 Wurzel rechter Teilbaum usw. Traversierung in Levelorder: 5, 2, 10, 1, 3, 7, 11, 9