7. Natürliche Binärbäume Ein Baum ist - ein azyklischer einfacher, zusammenhängender Graph - d. h. er enthält keine Schleifen und Zyklen: zwischen jedem Paar von Knoten besteht höchstens eine Kante Verallgemeinerung von Listen: Element (Knoten) hat möglicherweise mehrere Nachfolger (Söhne). Genau 1 Knoten ohne Vorgänger: Wurzel Knoten ohne Nachfolger: Blätter Häufig verwendete Datenstruktur: Entscheidungsbäume, Syntaxbäume, Ableitungsbäume, Suchbäume, ... Hier im Vordergrund: Verwendung von Bäumen zur Speicherung von Schlüsseln und Realisierung der Wörterbuchoperationen (Suchen, Einfügen, Entfernen) in Binärbäumen. G.Heyer 1 Algorithmen und Datenstrukturen Darstellungsarten für orientierte Bäume 1) Mengendarstellung 2) Klammerdarstellung 3) Rekursives Einrücken 4) Graphendarstellung Stufe/Niveau 0 x a b G.Heyer d c e 2 h 1 f 2 g 3 Algorithmen und Datenstrukturen Baum B heißt geordnet, wenn Nachfolger jedes Knotens geordnet sind (1., 2., 3. etc.; linker, rechter). Bei einem geordneten Baum bilden die Unterbäume Bi jedes Knotens eine geordnete Menge. (Beispiel: Arithmetischer Ausdruck) Eine geordnete Menge von geordneten Bäumen heißt Wald. Ordnung von B: maximale Anzahl von Nachfolgern eines Knotens Pfad der Länge k: Folge p0, ..., pk von Knoten, so daß gilt: pi Nachfolger von pi-1. Höhe eines Baums: maximaler Abstand eines Blattes von der Wurzel. Tiefe eines Knotens: Abstand zur Wurzel, d.h. Anzahl der Kanten auf dem Pfad von diesem Knoten zur Wurzel. Die Knoten auf dem Niveau i sind alle Knoten mit Tiefe i. Ein Baum der Ordnung n heißt vollständig, wenn alle Blätter dieselbe Tiefe haben und auf jedem Niveau die maximale Anzahl von Knoten vorhanden ist. G.Heyer 3 Algorithmen und Datenstrukturen Definition Ein Binärbäum ist ein geordneter Baum, in dem jeder Knoten höchstens zwei Söhne besitzt (Ordnung 2). Üblicherweise wird verlangt, dass jeder Knoten 2 oder 0 Nachfolger hat. Ein Binärbaum ist eine endliche Menge von Elementen, die entweder leer ist oder ein ausgezeichnetes Element - die Wurzel des Baumes - besitzt und folgende Eigenschaften aufweist: - Die verbleibenden Elemente sind in zwei disjunkte Untermengen zerlegt. - Jede Untermenge ist selbst wieder ein Binärbaum und heißt linker bzw. rechter Unterbaum des ursprünglichen Baumes G.Heyer 4 Algorithmen und Datenstrukturen Formale ADT-Spezifikationen Datentyp BINBAUM Basistyp ELEM Operationen: { TRUE, FALSE }; LEER: BINBAUM BAUEBAUM: BINBAUM x ELEM x BINBAUM BINBAUM; LINKS: BINBAUM - {b0} BINBAUM; WURZEL: BINBAUM - {b0} ELEM; RECHTS: BINBAUM - {b0} BINBAUM; ERZEUGE: b0 G.Heyer 5 Algorithmen und Datenstrukturen l, r, BINBAUM, d ELEM LEER ( BAUEBAUM ( l, d, r )) = FALSE ; LINKS ( BAUEBAUM ( l, d, r )) = l ; WURZEL ( BAUEBAUM ( l, d, r )) = d ; RECHTS ( BAUEBAUM ( l, d, r )) = r ; Satz: Die maximale Anzahl von Knoten eines Binärbaumes (1) auf Stufe i ist 2i , i 0 (2) der Höhe h ist 2h - 1 , h 1 Definition: Ein vollständiger Binärbaum der Stufe n hat folgende Eigenschaften: - Jeder Knoten der Stufe n ist ein Blatt. - Jeder Knoten auf einer Stufe < n hat nicht-leere linke und rechte Unterbäume. G.Heyer 6 Algorithmen und Datenstrukturen Definition: In einem strikten Binärbaum besitzt jeder innere Knoten nicht-leere linke und rechte Unterbäume. Definition: Ein fast vollständiger Binärbaum ist ein Binärbaum (k 0), so daß gilt: (1) Jedes Blatt im Baum ist auf Stufe k oder k+1 (2) Falls ein innerer Knoten einen rechten Nachfolger auf Stufe k + 1 besitzt, dann ist sein linker Teilbaum vollständig mit Blättern auf Stufe k + 1. (3) Jeder Knoten auf Stufe < k hat nicht-leere linke und rechte Teilbäume. Definition: Bei einem ausgeglichenen Binärbaum ist jedes Blatt auf Stufe k oder k + 1 ( k 0 ). Jeder Knoten auf Stufe < k hat nicht-leere linke und rechte Teilbäume. Zwei Binärbäume werden als ähnlich bezeichnet, wenn sie dieselbe Struktur besitzen. Sie heißen äquivalent, wenn sie ähnlich sind und dieselbe Information enthalten. G.Heyer 7 Algorithmen und Datenstrukturen Eigenschaften von Binärbäumen 1) Für zwei beliebige Knoten in einem Baum existiert genau ein Pfad, der sie verbindet. 2) Ein Binärbaum mit N Knoten hat N-1 Kanten. 3) Ein binärer Baum mit N inneren Knoten hat N + 1 äußere Knoten. 4) Die Höhe eines vollständigen binären Baumes mit N inneren Knoten beträgt log2N. G.Heyer 8 Algorithmen und Datenstrukturen Binäre Suchbäume (natürliche Binärbäume) Für jeden Knoten p eines binären Suchbaums gilt: Die Schlüssel im linken Teilbaum von p sind sämtlich kleiner als der Schlüssel von p, und dieser wiederum ist kleiner als sämtliche Schlüssel im rechten Teilbaum von p. Ein binärer Suchbaum B =<K,A,S> für eine linear geordnete Menge M ist ein geordneter, binärer Baum B =<K,A> mit einer Abbildung S: K->M von der Knotenmenge K in die Schlüsselmenge M. Für jeden Knoten k von B muss gelten: (1) S(k) > S(u) für alle Knoten u im linken Teilbaum von k, (2) S(k) <=S(u) für alle Knoten u im rechten Teilbaum von k. Aufbau von Binärbäumen (Beispiel). G.Heyer 9 Algorithmen und Datenstrukturen 2 Arten der Speicherung: 1) Suchbäume: Schlüssel an inneren Knoten gespeichert, Blätter repräsentieren Intervalle 2) Blattsuchbäume: Schlüssel in Blättern gespeichert, Markierung an inneren Knoten dienen als "Wegweiser" zum Finden des richtigen Blattes. G.Heyer 10 Algorithmen und Datenstrukturen Repräsentation von Binärbäumen: 1) Arrays. Nachfolger von a[i] sind a[2i] und a[2i+1] Feldbaum - Realisierung Simulation einer dynamischen Struktur in einem statischen Feld. Eigenschaften: - statische Speicherplatzzuordnung - explizite Freispeicherverwaltung G.Heyer 11 Algorithmen und Datenstrukturen Speicherung von Binärbäumen 2) Verkettete Speicherung * Info * Lsohn Rsohn ... ... Freispeicherverwaltung der Struktur wird von der Speicherverwaltung des Programmiersystems übernommen. G.Heyer 12 Algorithmen und Datenstrukturen Typdefinition typedef struct Knoten { int key ; infotype info ; struct Knoten *leftson, *rightson; }; typedef struct Knoten *Knotenzeiger; Knotenzeiger G.Heyer Wurzel; 13 Algorithmen und Datenstrukturen Suchen in natürlichen Binärbäumen Annahme: Für jeden Knoten k mit Söhnen p0,..., pl-1 und Schlüsseln s1, ..., sl-1 gilt (Suchbaumbedingung): alle im Teilbaum unter pi-1 gespeicherten Schlüssel sind kleiner als si, si ist kleiner als alle im Teilbaum unter pi gespeicherten Schlüssel (1 i l-1). Suche nach Schlüssel x: Suche in gerade inspiziertem Knoten kleinstes i, so daß x < si. Falls solches si existiert, führe Suche in Knoten fort, auf den pi-1 zeigt (falls pi-1 = nil Suche erfolglos) . Falls solches si nicht existiert, führe Suche in Knoten fort, auf den pi zeigt (falls pi = nil Suche erfolglos) . Maximale Anzahl inspizierter Knoten: Tiefe des Baumes. Suche innerhalb der Knoten etwa durch lineares oder binäres Suchen zu realisieren. Da l m, ist Aufwand dafür konstant. G.Heyer 14 Algorithmen und Datenstrukturen void Suchen (Knotenzeiger p, int x) { if ( p == NULL ) printf („Schluessel nicht gefunden!\n“); if ( x < p --> key) Suchen( p--> leftson, x ); else ( if x > p--> key ) Suchen( p --> rightson, x); else printf („Schluessel gefunden! \n“); } G.Heyer 15 Algorithmen und Datenstrukturen