Bäume
Wenn ein Knoten mehrere
Nachfolger hat
Definition
Ein Baum ist eine endliche Menge B eines oder mehrerer Knoten
derart, dass
Es ein ausgezeichnetes Element, Wurzel genannt, gibt
Die übrigen Knoten in m≥0
disjunkte Mengen aufgeteilt sind und jede dieser Mengen
(Unterbäume) ein Baum ist
Bemerkungen
Die Definition ist rekursiv
Jeder Knoten eines Baums ist die
Wurzel eines Unterbaums
Terminologie
Ist K ein Knoten eines Baums so ist Grad(K) = Anzahl Unterbäume von B
Falls Grad(K) = 0 so heisst K Blattknoten
Ist B ein Baum und K ∈ B so ist
ZE(K, B) = 0 , falls K die Wurzel von B ist und falls K ∈ U für einen
Unterbaum U ist, so ist ZE(K,B) =
ZE(U,B) + 1
Terminologie (Fortsetzung)
Ist K ein Knoten und die Menge {B 1 , ..., B m } seine Unterbäume, so ist Grad(K) = m
K ist der Vater von B 1 , ..., Bm
Jeder B i ist der Sohn von K
Alle B i 's sind Brüder
Falls alle Bi für alle K in einer
bestimmten Reihenfolge vorliegen, so ist B geordnet
Ein Wald ist eine Menge von 0 oder
mehreren disjunkten Bäumen
Klassifizierung von Indo-europäische Sprachen
indo-europaeischitalisch hellenisch germanisch
oskisch/umbrisch griechisch nordgermanisch west germanisch
oskisch umbrisch islandisch norwegisch schwedisch nieder
deutsch hoch
deutschYiddisch lateinisch
franz spanisch ital roumaen.
A
B C D
E F G H I
J K L M N O P Q R S T U
a)
Beispiel:
Abstammungsbaum
Bei Genealogien
Ahnentafel: Von einer Person alle Vorfahren
Stammtafel: Abstammung der
genealogischen Abfolge von einem Urahnen
Datenstrukturen verwenden zweite
Art von Baum
Definition
Ein Binärbaum B ist eine
geordnete endliche Menge von
Knoten , die entweder leer ist oder aus 2 Binärbäumen {B 1 ,B 2 }
besteht
B 1 heisst linker Unterbaum und B 2
heisst rechter Unterbaum von B
Bemerkungen
Die Definition eines Binärbaums ist rekursiv
Ein Binärbaum ist kein Sonderfall eines Baums
Ein Binärbaum ist geordnet
Ab jetzt sind alle Bäume
Binärbäume
Ein geordneter Baum
10
5 15
3 8
9
12 18
1 4 14
Programmdarstellung Binärbäume
Daten werden in gewöhnlicher DATA
Struktur gehalten
Beide Nachfolger jedes Knoten werden mit Zeiger verkettet
Leere Nachfolger werden mit
Zeigerwert NULL dargestellt
Die Datei baum.h
typedef ... DATA;
typedef struct Bknoten{
DATA d;
struct Bknoten *links;
struct Bknoten *rechts;
} BKNOTEN;
typedef BKNOTEN *BAUMZEIGER;
BAUMZEIGER Wurzel;
Einige Baumoperationen
Leere Baum initialisieren:
Baum mit 1 Knoten initialisieren:
Prüfe, ob der Baum leer ist:
Daten einfügen:
BAUMZEIGER initBaum()
BAUMZEIGER initBaum(DATA *)
int istLeer()
void einfuegen(BAUMZEIGER *, DATA);
Noch einige Baumoperationen
Linken Baum anheften:
Rechten Baum anheften:
Daten holen:
BAUMZEIGER linksSetzen(BAUMZEIGER, DATA *);
BAUMZEIGER rechtsSetzen(BAUMZEIGER, DATA *);
DATA getData(BAUMZEIGER);
Bemerkungen
Einige Operationen sind privat, da sie interne Operationen ausführen, z.B.
Linken Baum anheften
Nicht vergessen, der Baum ist nach einer vorgegebenen Regel geordnet, daher z.B. einfuegen ohne Knotenzeiger
Siehe Bild: Für jeden Knoten sind alle
Daten links kleiner und alle Daten rechts
größer als die Daten des Knotens
Operation: Einfügen eines Knoten
void einfuegen(BAUMZEIGER *WurzelPtr, DATA *dataPtr){
if ( *WurzelPtr == NULL){
*WurzelPtr = (BAUMZEIGER)malloc(sizeof(BKNOTEN));
(*WurzelPtr)->d = *dataPtr;
(*WurzelPtr)->links = (*WurzelPtr)->rechts = NULL;}
else if (*dataPtr < (*WurzelPtr)->d)
einfuegen(&((*WurzelPtr)->links), dataPtr);
else if (*dataPtr > (*WurzelPtr)->d)
einfuegen(&((*WurzelPtr)->rechts), dataPtr);
else fprintf(stderr, "Element is bereits vorhanden\n");
}
Bemerkungen
Diese Funktion wurde rekursiv realisiert
Knoten werden immer am Rande des Baums (d.h. bei Blattknoten) eingefügt
Die Adresse des Knotenzeigers muss übergeben werden