Übung Algorithmen und Datenstrukturen Sommersemester 2016 Kim Völlinger Humboldt-Universität zu Berlin 2 3 Binäre Suchbäume • Knoten • beinhaltet „Schlüssel“ ( label(v) ) • hat Verweis auf linkes ( v.leftChild() ) und rechtes Kind ( v.rightChild() ) • Sortierung/Sucheigenschaft • Schlüssel des linken Teilbaums eines Knotens sind kleiner als Schlüssel des Knotens selbst • Schlüssel des rechten Teilbaums eines Knotens sind größer als Schlüssel des Knotens selbst • betrachten nur binäre Suchbäume ohne Duplikate 10 15 6 1 8 13 19 14 4 Symmetrischer Vorgänger Der symmetrische Vorgänger ist der Knoten mit dem größten Schlüsselwert kleiner als v. Er kann gefunden werden, ohne einen einzigen Vergleich der Schlüsselwerte durchzuführen. v 5 Symmetrischer Vorgänger Algorithmus ππ¦ππππππππππ π ππ (π£) Algorithmus π‘ππππππ₯πππ’π(π£) Input: Node π£ Input: Node π£ (1) (2) (3) (4) (1) (2) (3) (4) if (π£.leftChild()!= null) then return treeMaximum(v.leftChild()); endif return null while(v.rightChild() != null) do v = v.rightChild(); endwhile return label(v) Algorithmus π‘ππππππ₯πππ’π(π£) Input: Node π£ (1) (2) (3) (4) if (π£. rightChild() != null) then return treeMaxmimum(π£. πππβπ‘πΆβπππ()); endif return label(v) 6 Baumtraversierung • Häufig müssen alle Knoten eines Baumes besucht werden, um bestimmte Operationen auf ihnen durchführen zu können. • Traversierungsarten • Methoden unterscheiden sich in der Reihenfolge, in der Knoten besucht werden. • Preorder: Wurzel, Linker TB, Rechter TB: A, B, C, D • Inorder: Linker TB, Wurzel, Rechter TB: C, B, A, D • Postorder: Linker TB, Rechter TB, Wurzel: C, B, D, A A B • Komplexität: π(|π|) D C 7 Baumtraversierung Gegeben Sei der nachfolgende Baum. Gib die Schlüssel in Inorder- und Preorder-Reihenfolge an. 30 22 55 20 44 66 33 8 Baumtraversierung • Inorder-/Preorder-/Postorder-Traversierung können elegant rekursiv ausgedrückt werden. Algorithmus ππππππππ(π£) Algorithmus πππππππ(π£) Algorithmus πππ π‘πππππ(π£) Input: Node π£ Input: Node π£ Input: Node π£ (1) (2) (3) (4) (5) (1) (2) (3) (4) (5) (1) (2) (3) (4) (5) if (π£!= null) then print label(v); preorder(π£. ππππ‘πβπππ()); preorder(π£. πππβπ‘πβπππ()); endif if (π£!= null) then inorder(π£. ππππ‘πβπππ()); print label(v); inorder(π£. πππβπ‘πβπππ()); endif if (π£!= null) then postorder(π£. ππππ‘πβπππ()); postorder(π£. πππβπ‘πβπππ()); print label(v); endif 9 Preorder-Traversierung: Iterativ & Rekursiv • Zum Vergleich ist der iterative Algorithmus der Preorder-Traversierung deutlich schlechter lesbar. Algorithmus ππππππππ(π£) Algorithmus ππππππππ(π£) Input: Node π£ Input: Node π£ (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (1) (2) (3) (4) (5) if (v == null) then return endif; Stack<Node> stack; stack.push(v) while (NOT stack.empty()) do v = stack.pop(); print label(v); if (v.rightChild() != null) then v = v.rightChild() endif if (v.leftChild() != null) then v = v.leftChild() endif end while return list; if (π£!= null) then print label(v); preorder(π£. ππππ‘πβπππ()); preorder(π£. πππβπ‘πβπππ()); endif 10 11 AVL-Bäume • Problem: Komplexität von Such-/Einfüge-/Lösch-Operationen abhängig von der Höhe des binären Suchbaums - maximal π(|π|). • Lösung: Balancierte Suchbäume wie AVL-Baum garantieren logarithmische Höhe und damit Komplexität π(log |π|). • AVL-Baum: In jedem Knoten unterscheidet sich die Höhe der beiden Teilbäume um höchstens Eins. • Rebalancierung (Rotation) beim Einfügen und Löschen. • Definition: • Sei u Knoten in binärem Baum. • bal(u) : Differenz zwischen Höhe des rechten Teilbaums von u und Höhe des linkes Teilbaums von u • Ein binärer Baum heißt AVL-Baum, falls für alle Knoten u gilt: |bal(u)| ≤ 1 10 1 6 0 15 –1 1 0 8 0 13 1 19 0 14 0 12 Rebalancierung von AVL-Bäumen • Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe • 4 Rotationsoperationen auf AVL-Bäumen: 1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u) u +2 v v 0 +1 h h h+1 h+1 h+2 h+2 0 u 13 Rebalancierung von AVL-Bäumen • Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe • 4 Rotationsoperationen auf AVL-Bäumen: 1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u) 2. bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u) u v -2 v -1 0 u 0 h h h+1 h+1 h+2 h+2 14 Rebalancierung von AVL-Bäumen • Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe • 4 Rotationsoperationen auf AVL-Bäumen: 1. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u) 2. bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u) 3. bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u) u 0 +2 v h w 0 -1 u w v 0 h h+1 h+1 h+2 h+2 15 Rebalancierung von AVL-Bäumen • Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe • 4 Rotationsoperationen auf AVL-Bäumen: 1. 2. 3. 4. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u) bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u) bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u) bal(u) = -2, bal(v) = 1: Doppelrotation Links(v) + Rechts(u) u v h 0 -2 0 1 w v w u 0 h h+1 h+1 h+2 h+2 16 Rebalancierung von AVL-Bäumen • Sei u Knoten, v Kind von u im Teilbaum mit größerer Höhe • 4 Rotationsoperationen auf AVL-Bäumen: 1. 2. 3. 4. bal(u) = 2, bal(v) = 1: Einfachrotation Links(u) bal(u) = -2, bal(v) = -1: Einfachrotation Rechts(u) bal(u) = 2, bal(v) = -1: Doppelrotation Rechts(v) + Links(u) bal(u) = -2, bal(v) = 1: Doppelrotation Links(v) + Rechts(u) • Komplexität: Rotationen sind lokale Operationen, die nur Umsetzen einiger Zeiger erfordern, und in Zeit πͺ(1) erfolgen. • Aufgabe: Sei T ein leerer AVL-Baum. Fügen Sie nacheinander die Elemente 30, 20, 22, 55, 66, 44, 33 ein 17 Aufgabe zu AVL-Bäumen Sei T folgender AVL-Baum: 30 1 22 -1 20 0 55 -1 44 -1 66 0 33 0 Fügen Sie nacheinander die Schlüssel 39, 42 in T ein und zeichnen Sie den jeweiligen AVL-Baum nach jeder insertOperation. 18 Einfügen von 39 bal(44) = -2, bal(33) = 1: Doppelrotation Links(33) + Rechts(44) 30 1 22 -1 20 0 30 55 -1 22 44 -1 66 0 55 20 44 33 0 66 39 33 30 2 22 -1 20 0 30 1 55 -2 44 -2 66 0 33 1 39 0 22 -1 20 0 55 -1 39 0 33 0 66 0 44 0 19 Einfügen von 42 bal(55) = -2, bal(39) = 1: Doppelrotation Links(39) + Rechts(55) 30 1 22 -1 20 0 30 55 -1 39 0 33 0 22 66 0 55 20 0 66 0 44 44 0 39 33 42 30 2 22 -1 20 0 30 1 55 -2 39 1 33 0 66 0 44 -1 42 0 22 -1 20 0 44 0 39 0 33 0 55 1 42 0 66 0 20