12 Binärbäume

Werbung
12
Binärbäume
12.1 Grundlagen - Denitionen
Denition: Ein Baum ist eine Menge, die durch eine sog. Nachfolgerrelation
strukturiert ist.
In einem Baum gilt:
1
(I)
∃ Knoten w ohne VATER(w), das ist die Wurzel
(II)
∀ Knoten k 6= w ∃ Knotenfolge k0 , k1 , . . . , kt mit k0 = k , kt = w und
ki =VATER(ki−1 ) für i = 1, 2, ..., t (Ast zwischen k und w, Länge t)
1
Ein Binärbaum ist ein spezieller Baum, in dem jeder Knoten maximal zwei
Söhne besitzt.
12.2 Nötige Funktionen
Ausgehend von einem Pointer k auf einen beliebigen Knoten sind folgende Funktionen sind nötig, damit eine Binärbaum B implementiert werden kann:
• LINKS(k): zeigt auf den linken Sohn des k -ten Knotens
• RECHTS(k): zeigt auf den rechten Sohn des k -ten Knotens
• VATER(k): zeigt auf den Vaterknoten des k -ten Knotens
• WERT(k): liefert den Wert des Knotens k zurück
• WURZEL(B): zeigt auf die Wurzel des Baumes
Anmerkung: Falls keine Sohnknoten oder Vaterknoten existiert wird nil zurückgeliefert.
1
12.3 Reihenfolge der Knoten
Die Knoten können in verschiedener Art und Weise eingefügt bzw. ausgelesen
werden.
12.3.1 Symmetrische Reihenfolge (SR)
Die Knoten werden in folgender Reihenfolge ausgelesen: Linker Teilbaum rekursiv in SR, Wurzel, rechter Teilbaum rekursiv in SR. Arithmetische Ausdrücke
werden als Inx -Notation ausgelesen.
SR(k)
1: IF
2:
3:
4:
k6=nil THEN
SR(LINKS(k))
SCHREIBE k
SR (RECHTS(k))
12.3.2 Haupreihenfolge (HR)
Analog die Auslesefolge: Wurzel, linker Teilbaum rekursiv in HR und rechter
Teilbaum rekursiv in HR.
12.3.3 Nebenreihenfolge (NR)
Analog die Auslesefolge: linker Teilbaum rekursiv in NR, rechter Teilbaum
rekursiv in NR und die Wurzel. Arithmetische Ausdrücke werden als Postx -Notation ausgelesen.
12.4 Sortierte Binärbäume
Im weiteren Abschnitt wird die SR verwendet. Der Binärbäum ist eine sehr
mächtige Datenstruktur, mit der viele Funktionen eektive implementiert werden können: SUCHEN, EINFÜGEN, LÖSCHEN, MINIMUM, MAXIMUM,
VORGÄNGER, NACHFOLGER.
Alle Funktionen können in O(Höhe des Baumes) implementiert werden.
Vorteil: Es kann das Wörterbuchproblem dynamisch gelöst werden
Nachteil: Laufzeiten bis Θ(n)
12.4.1 Suchen in Binärbäumen
Suche den Wert w im Binärbaum B . Der rekursive Algorithmus wird mit
SUCHE (b,Wurzel) gestartet.
2
SUCHE(w,k)
1: IF k=nil OR w=WERT(k)THEN
2:
RETURN k
3: ELSE
4:
IF w<WERT(k) THEN
5:
SUCHE(w,LINKS(k))
6:
ELSE
7:
SUCHE(w,RECHTS(k))
12.4.2 Finden des Maximus in einen Binärbaum
Liefert den gröÿten Wert des Binärbaumes zurück. Der Algorithmus wird mit
Baum_Maximum(Wurzel(B)) aufgerufen.
BAUM_MAXIMUM(k)
1: WHILE RECHTS(k)6=nil
2:
k=RECHTS(k)
3: RETURN WERT(k)
12.4.3 Finden des Minimums in einen Binärbaum
Liefert den kleinsten Wert des Binärbaumes zurück. Der Algorithmus wird mit
Baum_Minimum(Wurzel(B)) aufgerufen.
BAUM_MINIMUM(k)
1: WHILE LINKS(k)6=nil
2:
k=LINKS(k)
3: RETURN WERT(k)
12.4.4 Finden des Vorgängers eines Knotens
Es wird der nächst kleinere Wert zum WERT(k) gefunden.
VORGÄNGER(k)
1: IF LINKS(k)6=nil
2:
RETURN BAUM_MAXIMUM(LINKS(k))
3: y=VATER(k)
4: WHILE y6=nil AND k=LINKS(y)
5:
k=y
6:
y=VATER(y)
7: RETURN(WERT(y))
3
12.4.5 Finden des Nachfolger eines Knotens
Es wird der nächst höhere Wert zum WERT(k) gefunden.
NACHFOLGER(k)
1: IF RECHTS(k)6=nil
2:
RETURN BAUM_MINIMUM(RECHTS(k))
3: y=VATER(k)
4: WHILE y6=nil AND k=RECHTS(y)
5:
k=y
6:
y=VATER(y)
7: RETURN(WERT(y))
12.4.6 Einfügen in den Binärbaum
In den Binärbaum B wird der Wert w eingefügt.
EINFÜGEN(B,w)
1: y=nil
2: x=WURZEL(B)
3: WHILE x6=nil
4:
DO y = x
5:
IF w<WERT(x) THEN
6:
x=LINKS(x)
7:
ELSE x=RECHTS(x)
8: VATER[w]=y
9: IF y=nil
10:
THEN WURZEL(B)=w
11: ELSE IF w<WERT(y)
12:
THEN LINKS(y)=w
13: ELSE RECHTS(y)=w
12.4.7 Löschen eines Werts
Der Knoten k soll gelöscht werden. Dabei müssen drei Fälle unterschieden
werden, da die Sortierung in SR erhalten bleiben muss:
1. k ist ein Blatt: einfach entfernen
2. k hat nur einen Sohn: Den Sohn von k an den Vater von k anhängen
3. k hat zwei Söhne: Finde den Knoten k0 mit dem nächst gröÿten Wert
4
LÖSCHEN(k)
1: IF LINKS(k)=nil OR RECHTS(k)=nil
2:
THEN y=k
3:
ELSE y = NACHFOLGER(k)
4: IF LINKS(y)6=nil
5:
THEN x=LINKS(y)
6:
ELSE x=RECHTS(y)
7: IF x6=nil
8:
THEN VATER(x)=VATER(y)
9: IF VATER(y)=nil
10:
THEN WURZEL(B)=x
11:
ELSE IF y = LINKS(VATER(y))
12:
THEN LINKS(VATER(y))=x
13:
ELSE RIGHT(VATER(y))=x
14: IF y6=k
15:
THEN WERT(k)=WERT(y)
16:
IF ('andere Felder vorhanden, mitkopieren')
17: RETURN y
5
Herunterladen