Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

G.Heyer Algorithmen und Datenstrukturen 1 Durchlaufen eines Binärbaumes - Baumdurchlauf (tree traversal): Verarbeitung aller Baumknoten gemäß vorgegebener.

Ähnliche Präsentationen


Präsentation zum Thema: "G.Heyer Algorithmen und Datenstrukturen 1 Durchlaufen eines Binärbaumes - Baumdurchlauf (tree traversal): Verarbeitung aller Baumknoten gemäß vorgegebener."—  Präsentation transkript:

1 G.Heyer Algorithmen und Datenstrukturen 1 Durchlaufen eines Binärbaumes - Baumdurchlauf (tree traversal): Verarbeitung aller Baumknoten gemäß vorgegebener Strukturierung - Rekursiv anzuwendende Schritte 1) Verarbeitete Wurzel:W 2) Durchlaufe linken UB:L 3) Durchlaufe rechten UB:R - Durchlaufprinzip impliziert sequentielle, lineare Ordnung auf der Menge der Knoten. 6 Möglichkeiten WLLWRRLWRRWLRRWLLW123456WLLWRRLWRRWLRRWLLW Konvention: linker UB vor rechten UB

2 G.Heyer Algorithmen und Datenstrukturen 2 3 Strategien 1)Vorordnung ( preorder ):WLR 2)Zwischenordnung (inorder):LWR 3)Nachordnung (postorder):LRW Preorder: besuche Wurzel, traversiere linken Teilbaum, traversiere rechten Teilbaum Postorder: traversiere linken Teilbaum, traversiere rechten Teilbaum, besuche Wurzel Inorder : traversiere linken Teilbaum, besuche Wurzel, traversiere rechten Teilbaum Inorder heißt auch symmetrische Ordnung.

3 G.Heyer Algorithmen und Datenstrukturen 3 Beispiel: Preorder: 28, 16, 12, 8, 15, 19, 34, 31, 29, 49 Postorder:8, 15, 12, 19, 16, 29, 31, 49, 34, 28 Inorder: 8, 12, 15, 16, 19, 28, 29, 31, 34, 49 Hinweise: wenn man Baum von der Wurzel aus umfährt, erhält man Preorder durch Besuch aller Knoten, an deren linker Seite man vorbeikommt Postorder durch Besuch aller Knoten, an deren rechter Seite man vorbeikommt Inorder durch Besuch aller Knoten, an deren unterer Seite man vorbeikommt

4 G.Heyer Algorithmen und Datenstrukturen 4 Rekursive und Iterative Version: LWR - Rekursive Version : LWR LWR(Knotenzeiger Wurzel) { if (Wurzel != NULL) {LWR (Wurzel --> Lsohn); Verarbeite (Wurzel --> Info); LWR (Wurzel --> Rsohn); } }/* End LWR */

5 G.Heyer Algorithmen und Datenstrukturen 5 - Iterative Version: LWR Ziel: effizientere Ausführung durch eigene Stapelverarbeitung Vorgehensweise: Nimm, solange wie möglich linke Abzweigung und speichere den zurückgelegten Weg auf einen Stapel. Aktion 1: PUSH (S, Current); Current = Current --> Lsohn ; Wenn es links nicht mehr weiter geht, wird der oberste Knoten des Stapels ausgegeben und vom Stapel entfernt. Der Durchlauf wird mit dem rechten Unterbaum des entfernten Knotens fortgesetzt. Aktion 2: WriteString (TOP(S) --> Info) ; /*Verarbeite Info */ Current = TOP(S) --> Rsohn; POP(S);

6 G.Heyer Algorithmen und Datenstrukturen 6 Gefädelte Binärbäume - Weitere Verbesserung von iterativen Durchlaufalgorithmen - Methode benutzt einen Faden, der die Baumknoten in der Folge der Durchlaufordnung verknüpft. Zwei Typen von Fäden Rechtsfaden verbindet jeden Knoten mit seinem Nachfolgerknoten in Durchlaufordnung. Linksfaden stellt die Verbindung zum Vorgängerknoten in Durchlaufordnung her.

7 G.Heyer Algorithmen und Datenstrukturen 7 Einfügen Neue Knoten werden immer als Blätter eingefügt Aussehen des Baumes wird durch die Folge der Einfügungen bestimmt (Reihenfolge der Eingabeelemente!) Einfügen in binären Suchbäumen typedef struct Knoten { struct Knoten *Lsohn; Schluesseltyp Key; struct Knoten*Rsohn; } ; typedef struct Knoten *Kptr; KptrWurzel;

8 G.Heyer Algorithmen und Datenstrukturen 8 void Einfuegen (Knotenzeiger p, int k) { if ( p == NULL )/* Leerer Baum */ { p = (struct Knoten *) malloc (sizeof *p); p --> leftson = NULL; p --> rightson = NULL; p --> key = k; } else if (k key)Einfuegen( p --> leftson, k ) ; else if (k > p --> key ) Einfuegen ( p --> rightson, k ) ; else printf (Schluessel bereits vorhanden \n); }

9 G.Heyer Algorithmen und Datenstrukturen 9 Problem: es können "degenerierte" Bäume entstehen (etwa Listen). Entfernen eines Knotens: Sehr einfach:Entfernen eines Blattes Einfach: Entfernen eines Knotens p mit 1 Nachfolger: Knoten einfach durch Nachfolger ersetzen Schwieriger: Entfernen eines Knotens p mit 2 Nachfolgern: Suche am weitesten links stehenden Knoten q im rechten Teilbaum (symmetrischen Nachfolger). Ersetze p durch q, streiche q aus seiner ursprünglichen Position.

10 G.Heyer Algorithmen und Datenstrukturen 10 Knotenzeiger vatersymnach ( Knotenzeiger p) /* Liefert Zeiger auf Vater des symmetrischen */ /* Nachfolgers von p --> */ { if ( p --> rightson --> leftson == NULL) { p = p --> rightson; while ( p --> leftson --> leftson == NULL) p = p --> leftson; } vatersymnach = p; return vatersymnach; }

11 G.Heyer Algorithmen und Datenstrukturen 11 void Entfernen (Knotenzeiger p, int k) /* Entfernt Knoten mit Schluessel k aus Baum mit Wurzel p */ Knotenzeiger q ; {if (p == NULL) printf (Schluessel nicht im Baum \n); if (k key) Entfernen ( p--> leftson, k); else if ( (k > p --> key) Entfernen (p --> rightson, k ); else if ( p --> leftson == NULL) p = p --> rightson ; else if (p --> rightson == NULL) p = p --> leftson ; else/* zwei Nachfolger */ { q = vatersymnach (p); if ( q == p ) { p --> key = q --> rightson.key ; q --> rightson = q --> rightson.rightson; } else { p --> key = q --> leftson.key; q --> leftson = q --> leftson.rightson ; } }

12 G.Heyer Algorithmen und Datenstrukturen 12 Suche in binären Suchbäumen Direkte Suche: (Vorgehensweise wie bei Suche nach Einfügeposition Suchen eines Knotens (rekursive Version) Suche ( Kptr Wurzel, Schluesseltyp Skey) { if (Wurzel == NULL) return NULL; else if (Wurzel --> Skey < Key) return Suche(Lsohn, Skey); else if (Wurzel --> Skey > Key) return Suche(Rsohn, Skey); else return Wurzel; }

13 G.Heyer Algorithmen und Datenstrukturen 13 Suchen eines Knotens (iterative Version) Finde (Ktpr Wurzel, Schluesseltyp Skey) { int Gefunden; Gefunden = FALSE; do { if (Wurzel == NULL) Gefunden = TRUE; else if(Wurzel --> Skey < Key) Wurzel = Lsohn; else if (Wurzel --> Skey > Key) Wurzel = Rsohn; else Gefunden = FALSE; } while (Gefunden = TRUE); return Wurzel; } Sequentielle Suche Einsatz eines Durchlauf-Algorithmus (Zwischenordnung)

14 G.Heyer Algorithmen und Datenstrukturen 14 Binäre Suchbäume: Zugriffskosten Kostenmaß: Anzahl der aufgesuchten Knoten bzw. Anzahl der benötigten Suchschritte oder Schlüsselvergleiche. sequentielle Suche direkte Suche Mittlere Zugriffskosten z eines Baumes B erhält man durch Berechnung seiner gesamten Pfadlänge PL als Summe der Längen der Pfade von der Wurzel bis zu jedem Knoten K i. PL ( B )= Stufe (K i ) i = 1 n

15 G.Heyer Algorithmen und Datenstrukturen 15 Die mittlere Pfadlänge ergibt sich zu l = PL / n. Maximale Zugriffskosten Die längsten Suchpfade und damit die maximalen Zugriffskosten ergeben sich, wenn der binäre Suchbaum zu einer linearen Liste entartet. Höhe: h = l max + 1 = n

16 G.Heyer Algorithmen und Datenstrukturen 16 i = 0 (n + 1) 2n ( n + 1) 2 Minimale ( mittlere ) Zugriffskosten Sie können in einer fast vollständigen oder ausgeglichenen Baumstruktur erwartet werden. Gesamtzahl der Knoten: 2 h-1 -1 < n 2 h -1 Höhe h = [ log 2 n ] + 1 Minimale mittlere Zugriffskosten: z min log 2 n - 1 n-1 Maximale mittlere Zugriffskosten: z max = 1/n * ( i + 1 ) * 1 = n * = = O (n)

17 G.Heyer Algorithmen und Datenstrukturen 17 Durchschnittliche Zugriffskosten Extremfälle der mittleren Zugriffskosten sind wenig aussagekräftig. Differenz der mittleren zu den minimalen Zugriffskosten ist ein Maß für die Dringlichkeit von Balancierungen. Bestimmung der mittleren Zugriffskosten i i - 1 Knoten n - i Knoten B l B r znzn z n - i z i-1

18 G.Heyer Algorithmen und Datenstrukturen 18 n verschiedene Schlüssel mit den Werten 1, 2,..., n seien in zufälliger Reihenfolge gegeben. Die Wahrscheinlichkeit, dass der erste Schlüssel den Wert i besitzt, ist 1/n. (Annahme: gleiche Zugriffswahrscheinlichkeit auf alle Knoten) Für den Baum mit i als Wurzel erhalten wir z n ( i ) = 1/n * ( ( z i ) * ( i - 1) ( z n-1 + 1) * ( n - i ) ) Die Rekursions-Gleichung lässt sich in nicht-rekursiver, geschlossener Form mit Hilfe der harmonischen Funktion H n = n i =1 1 i1 i darstellen.

19 G.Heyer Algorithmen und Datenstrukturen 19 Es ergibt sich: z n = 2 * * H n - 3 = 2 ln ( n) - c. ( n + 1 ) n = = 2 ln ( 2 ) = Relative Mehrkosten: z n z min log 2 ( n ) ln ( n ) - c log 2 ( n ) Der ausgeglichene binäre Suchbaum verursacht für alle Grundoperationen die geringsten Kosten. Perfekte Balancierung zu jeder Zeit kommt jedoch sehr teuer.


Herunterladen ppt "G.Heyer Algorithmen und Datenstrukturen 1 Durchlaufen eines Binärbaumes - Baumdurchlauf (tree traversal): Verarbeitung aller Baumknoten gemäß vorgegebener."

Ähnliche Präsentationen


Google-Anzeigen