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.
Darstellungsarten für orientierte Bäume 1) Mengendarstellung 2) Klammerdarstellung 3) Rekursives Einrücken 4) Graphendarstellung Stufe/Niveau 1 2 3 x a d h b c e f g
Ordnung von B: maximale Anzahl von Nachfolgern eines Knotens 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.
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
Formale ADT-Spezifikationen Datentyp BINBAUM Basistyp ELEM Operationen: LEER: BINBAUM { TRUE, FALSE }; BAUEBAUM: BINBAUM x ELEM x BINBAUM BINBAUM; LINKS: BINBAUM - {b0} BINBAUM; WURZEL: BINBAUM - {b0} ELEM; RECHTS: BINBAUM - {b0} BINBAUM; ERZEUGE: b0
Satz: Die maximale Anzahl von Knoten eines Binärbaumes 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.
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.
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.
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).
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.
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
Speicherung von Binärbäumen 2) Verkettete Speicherung * Info * Lsohn Rsohn ... ... Freispeicherverwaltung der Struktur wird von der Speicherverwaltung des Programmiersystems übernommen.
Typdefinition typedef struct Knoten { int key ; infotype info ; struct Knoten *leftson, *rightson; }; typedef struct Knoten *Knotenzeiger; Knotenzeiger Wurzel;
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.
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“); }