Wrum Bäume? Teil : Suhen Prolemstellung Elementre Suhverfhren Hshverfhren Binäre Suhäume (Wiederholung us Prog ) Bäume: Begriffe, Eigenshften und Trversierung Binäre Suhäume Gefädelte Suhäume Ausgeglihene Bäume B-Bäume Digitle Suhäume M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Hshverfhren erluen Suhe, Einfügen und Löshen in konstnter Zeit, er: Opertionen, für die die Reihenfolge der Dten wihtig ist, werden niht unterstützt. e: finde Minimum, Mximum Anlyse/Ausge der Dten in der korrekten Reihenfolge Binäre Suhäume erluen sortierte Bereitung in O(n log n), Suhe, Einfügen, Finden von Mxim und Minim und Löshen immerhin in durhshnittlih O(log n). M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Bäume: Begriffe und Eigenshften () Wurzel Elternknoten zu s und t Bäume: Begriffe und Eigenshften () Höhe eines Bums Mximle Anzhl von Knten von seiner Wurzel zu einem Bltt. Linkes Kind von k; Wurzel des linken Teilums Knte s k t Rehtes Kind von k; Wurzel des rehten Teilums 0 Höhe für jeden Teilum 0 0 0 Linker Teilum von k Rehter Teilum von k 0 Binärum: Bum: Bltt Knoten Jeder Knoten ht Kinder (linkes und rehtes Kind), oder Kind (linkes oder rehtes Kind) oder keine Kinder. Jeder Knoten knn elieig viele Kinder hen Behte Ein Bum, der nur us einem Knoten esteht, esitzt die Höhe 0. Aus tehnishen Gründen wird die Höhe eines leeren Bums (d.h. Anzhl Knoten = 0) ls - definiert. M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -
Bäume: Begriffe und Eigenshften () Vollständiger Binärum Ein vollständiger Binärum ist ein Binärum, ei der jeder Eene (is uf die letzte) vollständig gefüllt und die letzte Eene von links nh rehts gefüllt ist. e Bäume: Begriffe und Eigenshften () Implementierung von Binäräumen mit verketteten Knoten Jeder Knoten ht jeweils einen Zeiger für ds linke zw. rehte Kind. 0 root 0 Eigenshften: Ein vollständiger Binärum mit n Knoten ht die Höhe h = log n. Vollständige Binäräume sind (ei einer gegeenen Knotenzhl) Binäräume mit einer minimlen Höhe. strut Node int dt; Node* left; // linkes Kind Node* right; // rehtes Kind ; M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Trversierung von Bäumen () Trversierung von Bäumen () Ziel Ds Besuhen ller Knoten in einer estimmten Reihenfolge ist eine oft enötigte Opertion. Durhlufreihenfolgen PreOrder: esuhe Wurzel, esuhe linken Teilum; esuhe rehten Teilum; PostOrder: esuhe linken Teilum; esuhe rehten Teilum; esuhe Wurzel; InOrder: esuhe linken Teilum; esuhe Wurzel; esuhe rehten Teilum; LevelOrder: esuhe Knoten eenenweise PreOrder-Trversierung void preorder(node* p) if (p!= 0) ereite(p->dt); preorder(p->left); preorder(p->right); // Definition eines Bums: strut Node int dt; Node* left; // linkes Kind Node* right; // rehtes Kind ; Node* root; Bemerkungen Die Präfixe Pre, Post zw. In edeuten vorher, nhher und dzwishen. Gemeint ist dmit der Zeitpunkt, zu dem die Wurzel esuht wird. InOrder-Durhluf ist nur für Binäräume sinnvoll. // Aufruf von preorder preorder(root); Bereitungsreihenfolge: * - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -
Diretory-Liste durh Preorder-Trversierung Trversierung von Bäumen () PostOrder-Trversierung void postorder(node* p) if (p!= 0) postorder(p->left); postorder(p->right); ereite(p->dt); Bereitungsreihenfolge: (Weiss, ) * (Entspriht der sog. Postfix-Nottion für rithmetishe Ausdrüke) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -0 Size(diretory) durh Postorder-Trversierung Trversierung von Bäumen () InOrder-Trversierung void inorder(node* p) if (p!= 0) inorder(p->left); ereite(p->dt); inorder(p->right); Durhlufreihenfolge: (Weiss, ) * (ls mthemtisher Ausdruk interpretiert, erhält mn ( - ) * ) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -
Trversierung von Bäumen () Level-Order-Trversierung Die Knoten werden eenenweise in einer Shlnge (Queue) gespeihert und in einer while-shleife gereitet. void levelorder(node* p) Queue<Node*> queue; queue.push(p); // Eene 0 while (!queue.empty() ) Node* q; // Shreie vorderstes Element us Shlnge // nh q und löshe Element us Shlnge: queue.front(q); queue.remove(); if (q!= 0) ereite(q->dt); queue.insert(q->left); queue.insert(q->right); M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Durhlufreihenfolge: * Definition von inären Suhäumen Vorussetzung Alle Knoten in einem Bum enthlten einen Shlüssel (Key) und Nutzdten (vlue). Definition Ein inärer Suhum ist ein Binärum, ei dem für lle Knoten k folgende Eigenshften gelten: () Alle Shlüssel im linken Teilum sind kleiner ls der Shlüssel im Knoten k () Alle Shlüssel im rehten Teilum sind größer ls der Shlüssel im Knoten k e strut Node KeyType key; VlueType vlue; Node* left; // linkes Kind Node* right; // rehtes Kind ; In den Bäumen sind nur die Shlüssel drgestellt. M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Degenerierter Suhum Suhen in inären Suhäumen Opertion serhr ool serhr(keytype k, VlueType& v, onst Node* p); Suhe nh einem Knoten mit Shlüssel k im Teilum p. Flls gefunden, wird der im Knoten speiherte Dtenwert v und der Rükgewert true zurükgeliefert. Flls niht gefunden, wird der Rükgewert flse zurükgeliefert. Algorithmus ool serhr(keytype k, VlueType& v, onst Node* p) R steht für rekursiv if (p == 0) return flse; else if (k < p->key) return serhr(k, v, p->left); else if (k > p->key) return serhr(k, v, p->right); else // k gefunden v = p->vlue; return true; serhr(,v,p) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - p Einfügen in inären Suhäumen () Idee Um einen Shlüssel k einzufügen, wird zunähst nh dem Shlüssel k gesuht. Flls der einzufügende Shlüssel k niht ereits im Bum vorkommt, endet die Suhe erfolglos ei einem 0-Zeiger. An dieser Stelle wird dnn ein neuen Knoten mit Shlüssel k eingefügt. : füge ein Suhe von endet ei 0-Zeiger Ersetzte 0-Zeiger durh Zeiger uf Knoten : füge ein M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Suhe von endet ei 0-Zeiger Ersetzte 0-Zeiger durh Zeiger uf Knoten
Einfügen in inären Suhäumen () Opertion insertr ool insertr(keytype k, VlueType v, Node*& p); Fügt im Teilum p neuen Knoten mit Shlüssel k und Dtenwert v ein. Flls Shlüssel shon vorhnden, wird kein neuer Knoten eingefügt. Behte: Der Prmeter p ist ein Ein/Ausgeprmeter und dher ls Referenzprmeter relisiert. Der Teilum wird gelesen und geändert. Algorithmus ool insertr(keytype k, VlueType v, Node*& p) if (p == 0) p = new Node; p->key = k; p->vlue = v; return true; else if (k < p->key) return insertr(k,v,p->left); else if (k > p->key) return insertr(k,v,p->right); else // k ereits vorhnden return flse; M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - p p insert(, v, p) Idee Löshen in inären Suhäumen () Um einen Shlüssel k zu löshen wird zunähst nh dem Shlüssel k gesuht. Es sind dnn Fälle zu untersheiden: Fll Niht vorhnden : Shlüssel k kommt niht vor: dnn ist nihts zu tun. Fll Keine Kinder : Der Shlüssel kommt in einem Bltt vor (keine Kinder): dnn knn der Knoten einfh entfernt werden. Fll Ein Kind : Der Knoten mit dem gefundenen Shlüssel ht genu ein Kind: s. nähste Folie Fll Zwei Kinder : Der Knoten mit dem gefunden Shlüssel ht zwei Kinder s. üernähste Folie M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Löshen in inären Suhäumen () Fll Ein Kind Der zu löshende Knoten k ht genu ein Kind. Üerrüke den Knoten k, indem der Elternknoten von k uf Kind von k verzeigert wird (Bypss) und löshe k. : löshe Knoten mit Shlüssel Löshen in inären Suhäumen () Fll Zwei Kinder : Der zu löshende Knoten k ht zwei Kinder.. Ersetze den Knoten k durh den kleinsten Knoten k min im rehten Teilum von k.. Löshe dnn k min. D der kleinste Knoten k min im linken Teilum kein linkes Kind ht, knn ds Löshen von k min wie im Fll Ein Kind zw. Keine Kinder ehndelt werden. : löshe Knoten mit Shlüssel Suhe Knoten wird üerrükt und gelösht M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Knoten wurde gelösht Suhe Suhe kleinsten Knoten in rehten Teilum von M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -0 Knoten wurde durh kleinsten Knoten ersetzt kleinster Knoten wurde gelösht
Löshen in inären Suhäumen () ool remover(keytype k, Node*& p) if (p == 0) // k niht vorhnden return flse; else if (k < p->key) return remover(k,p->left); else if (k > p->key) return remover(k,p->right); else if (p->left == 0 p->right == 0) Node* temp = p; if (p->left!= 0) p = p->left; else p = p->right; delete temp; return true; // Bypss zu linkes Kind // Bypss zu rehtes Kind else // Min. im rehten Teilum suhen: Node* min = serhminr (p->right); // Zu löshender Knoten durh Min. ersetzen p->dt = min->dt; p->key = min->key; // Min. in rehtem Teilum löshen: return remover (min->key, p->right); Opertion remover Lösht im Teilum p Knoten mit Shlüssel k. Der Prmeter p ist ein Ein/Ausgeprmeter und dher ein Referenzprmeter. Knoten ht ein Kind oder kein Kind Knoten ht zwei Kinder M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Löshen in inären Suhäumen () Opertion serhminr Suht im Teilum p nh dem kleinsten Knoten und liefert Zeiger uf Minimum zurük. Node* serhminr(keytype k, onst Node* p) if (p == 0) // k niht vorhnden return 0; else if (p->left == 0) // Minimum gefunden return p; else return serhminr (k, p->left); Bemerkung Behten Sie, dss in der Opertion remover im Fll Knoten ht zwei Kinder der Aufruf von serhminr und der rekursive Aufruf von remover edeuten, dss zweiml vom rehten Kind p->right zum kleinsten Knoten gelufen wird. Diese Ineffizienz lässt sih jedoh eheen, indem serhminr noh zusätzlih ds Löshen des kleinsten Elements üernimmt. Der rekursive Aufruf von remover ist dnn üerflüssig. Diese Vrinte findet sih in der Quell-Code-Smmlung zur Vorlesung. M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Gefädelte Suhäume () Prolem In inären Suhäumen git es für einen Knoten im llgemeinen keinen effizienten Zugriff uf seinen InOrder-Vorgänger zw. -Nhfolger. Sollen Suhäume eispielsweise für ssozitive STL-Continer eingesetzt werden, ist jedoh eine effiziente Vorwärts- und Rükwärtstrversierung mit Itertoren notwendig. Lösung Ersetze in jedem Knoten den Links- zw. Rehts-Zeiger mit dem Wert 0 durh einen Zeiger uf seinen InOrder-Vorgänger zw. Nhfolger (Fädelung). O ein Zeiger uf ein Kind oder ein Vor- zw. Nhfolger zeigt, knn durh zusätzlihe oolshe Vrile vermerkt werden (siehe nähste Aufge). 0 Gefädelte Suhäume () Aufge. Ein gefädelter Suhum lässt sih eispielsweise durh folgenden Strukturdtentyp relisieren. strut Node int dt; Node* left; // linkes Kind zw. Vorgänger Node* right; // rehtes Kind zw. Nhfolger ool leftthred; // true, flls left uf InOrder-Vorgänger zeigt ool rightthred; // nlog. ; Shreien Sie für gefädelte Suhäume niht-rekursive C++-Funktionen für folgende Aufgen: ) Bestimme den In-Order-Nhfolger zu einem Knoten. ) Bestimme den In-Order-Vorgänger zu einem Knoten ) Ausge ller Knoten in In-Order-Reihenfolge. M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -
Anlyse von inären Suhäumen Worst-Cse D im shlehtesten Fll ein inärer Suhum mit n Knoten zu einem Bum der Höhe n- entrten knn (Bsp?), hen die Opertionen zum Suhen, Einfügen und Löshen eine mximle Suhlänge von n. Dmit: T mx (n) = O(n) Averge-Cse In [Ottmnn und Widmyer 00] wird gezeigt, dss die durhshnittlihe Lufzeit um eine Größenordnung esser ist. Es werden zwei Ergenisse hergeleitet, die sih drin untersheiden, welhe Verteilung der Bäume ngenommen wird: Bäume mit n Knoten entstehen durh eine Folge von Einfüge-Opertionen von n untershiedlihen Elementen. Es wird ngenommen, dss jede der n! möglihen Anordnungen der Elemente gleihwhrsheinlih ist. Gemittelt wird dnn üer die n! viele uf diese Weise erzeugten Bäume. Mn erhält dnn für die Suh-Opertion eine mittlere Suhlänge von ungefähr. log n. Dmit: T mit (n) = O(log n) Es wird ngenommen, dss lle strukturell vershiedenen inären Suhäume mit n Knoten gleihwhrsheinlih sind. Mn erhält dnn für die Suh-Opertion eine mittlere Suhlänge von ungefähr *n Dmit: T mit (n) = O( n) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Zufällig erzeugter Bum 00 Zufllszhlen in inären Suhum eingefügt => Tiefe ist ttsählih nhe n log n (us Weiss, ) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume - Proleme ei inären Suhäumen Die Annhme von zufällig verteilten Shlüsseln zw. gleihwhrsheinlihen Bumstrukturen ist niht immer erfüllt: oft werden Dten unsihtlih in geordeneter Form eingegeen delete fvorisiert Bäume mit tieferen linken Unteräumen, d ein gelöshter Knoten immer durh den minimlen Knoten des rehten Unterums ersetzt wird. Binärer Suhum nh N Pren von insert und remove (us Weiss, ) M.O.Frnz, Oktoer 00 Algorithmen und Dtenstrukturen - Binäräume -