• Keine Ergebnisse gefunden

¨Ubungspaket 33 Bin¨are B¨aume

N/A
N/A
Protected

Academic year: 2021

Aktie "¨Ubungspaket 33 Bin¨are B¨aume"

Copied!
8
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ubungspaket 33 ¨ Bin¨ are B¨ aume

Ubungsziele: ¨

1. Definition eines bin¨ aren Baums 2. Das L-K-R Ordnungsprinzip

3. Konstruktion eines bin¨ aren Baums 4. Traversieren eines bin¨ aren Baums Skript:

Kapitel: 76 Semester:

Wintersemester 2021/22 Betreuer:

Thomas, Tim und Ralf Synopsis:

In diesem ¨ Ubungspaket besch¨ aftigen wir uns mit B¨ aumen. Diese wach- sen in der Informatik nicht in den Himmel sondern nach unten. Aber das ist eigentlich kein Problem, der Stack w¨ achst ja auch nach unten und daran haben wir alle uns langsam gew¨ ohnt.

Das Hauptproblem mit B¨ aumen kommt meist aus der Datenstruktur:

Jedes Element ist eine Struktur mit mindestens zwei Zeigern, die wie-

der auf andere Elemente des selben Typs zeigen. Das bereitet oftmals

Kopfzerbrechen. Aber hat man sich daran erst einmal gew¨ ohnt, findet

man den Rest sehr einfach und B¨ aume pl¨ otzlich cool. . .

(2)

Teil I: Stoffwiederholung

Aufgabe 1: Allgemeines zu B¨ aumen

Erkl¨are mit eigenen Worten, was man in der Informatik unter einem Baum versteht:

Ein Baum besteht aus mehreren Elementen, die man auch Knoten nennt. In diesen Knoten sind die eigentlichen Daten abgespeichert. Jeder Knoten kann Nachfolger haben. Bei einem bin¨aren Baum sind dies zwei, bei einem tertieren Baum drei usw. Die einzelnen Knoten sind durch Pfeile miteinander verbunden. Diejenigen Knoten, die keine weiteren Nachfolger haben, nennt man wie in der Natur auch Bl¨atter. Denjenigen Knoten, der keinen Vorg¨anger hat, nennt man in Anlehnung an die Natur auch Wurzel. Wie in der Informatik ¨ublich, kann ein Baum auch leer sein, sodass er aus keinem einzigen Knoten besteht.

Erkl¨are mit eigenen Worten, was man unter dem L-K-R Ordnungsprinzip versteht:

Wie oben schon ausgef¨uhrt speichern die einzelnen Knoten die Daten des Nutzers. Ferner wissen wir, dass jeder Knoten zwei oder mehr Nachfolger haben kann. Damit man beim Suchen der Daten nicht alle Knoten anschauen muss, werden B¨aume meist sortiert. Bei einem L-K-R Baum gilt, dass alle Knoten des linken Teilbaums kleinere Werte als der betrachtete Knoten haben und der rechte Teilbaum nur gr¨oßere. Dadurch weiß man beim Suchen immer, ob man ggf. links oder rechts weitersuchen muss.

Aufgabe 2: Detailfragen zu B¨ aumen

In welche Richtung wachsen Informatik-B¨aume? Von oben nach unten Wie sind die Knoten miteinander verbunden? Mit Pfeilen

Wie viele Nachfolger hat ein bin¨arer Baum? 2 (zwei) (two) (due)

Wie heißen die beiden Teile ¨ublicherweise? linker und rechter Teilbaum Wie heißen die

”untersten“ Knoten? Bl¨atter Wie heißt der

”oberste“ Knoten? Wurzel

Wie druckt man B¨aume am elegantesten? Rekursiv Wie sucht man in B¨aumen am elegantesten? Rekursiv

Wie f¨ugt man Knoten am elegantesten hinzu? Rekursiv (ist aber nicht einfach) Welches ¨Ubungspaket sollte ich unbedingt k¨onnen? 22: Rekursion

(3)

Teil II: Quiz

Aufgabe 1: Konstruktion eines Baumes

Nehmen wir an, wir haben einen Baum zum Ablegen von int-Zahlen, der L-K-R sortiert sein soll. Nehmen wir ferner an, wir haben bereits einen Knoten in dem sich die Zahl 22 befindet. Wie sieht der resultierende Baum aus, wenn wir der Reihe nach die folgenden Zahlen in den Baum einf¨ugen: 1 6 4 -1 5 50 10 30 12 60?

Der resultierende Baum sieht in ASCII Art wie folgt aus (Nullzeiger sind nicht illustriert):

t r e e - -+

v - - - -

+ - - - -( 22 ) - - - -+

v - - - - v

- - - -

+ - - - - -( 1 ) - - - - -+ + - - - - -( 50 ) - - - - -+

v - - - v v - - - - v

- - - -

( -1 ) + - - - -( 6 ) - - - -+ ( 30 ) ( 60 )

- - - - v - - - v - - - -

- - - -

( 4 ) -+ ( 10 ) -+

- - - v - - - - v

- - - -

( 5 ) ( 12 )

- - - -

Aufgabe 2: Drucken eines Baumes

Nehmen wir ferner an, wir haben f¨ur das Drucken eines Baumes folgenden Algorithmus:

Funktion zum Drucken eines Baums Parameter: Pointer to Node: tree wenn tree 6= Null-Zeiger

dann druckeBaum( tree dereferenziert rechts ) Ausgabe tree dereferenziert Zahl

druckeBaum( tree dereferenziert links )

(4)

Teil III: Fehlersuche

Aufgabe 1: L-K-R B¨ aume

Dr. BiB eLKaeR hat versucht, einen bin¨aren Baum mit einer L-K-R Sortierung zu er- stellen. Ein erster Blick verr¨at: das hat nicht ganz geklappt. Wie bei einem bekannten Japanischen Zahlenr¨atsel sei gesagt, dass diejenigen Zahlen, die in eckigen Klammern ste- hen, mit Sicherheit richtig sind. Alle anderen Knoten enthalten falsche Zahlen, die aus dem Baum entfernt werden m¨ussen. Ferner sei verraten, dass die kleinste Zahl des Baums6 ist.

Versucht den Baum so zu korrigieren, dass es sich tats¨achlich um eine L-K-R Sortierung handelt und obige Randbedingungen nicht verletzt sind. Viel Spass :-))

Ein fehlerhafter L-K-R Baum:

t r e e - -+

v - - - -

+ - - - -( 50 ) - - - -+

v - - - - v

- - - -

+ - - - - -[ 49 ] - - - - -+ + - - - - -( 70 ) - - - - -+

v - - - - v v - - - - v

- - - -

( 8 ) - - - -+ ( -1 ) - - - -+ ( 55 ) - - -+ ( 61 ) - -+

- - - v - - - - v - - - - v - - - - v

- - - -

+ -( 0 ) -+ + -( -2 ) -+ + -( 97 ) -+ + -[ 62 ]

v - - - v v - - - - v v - - - - v v - - - -

- - - -

( 5 ) [ 9 ] ( 33 ) ( 31 ) ( 22 ) ( 13 ) ( 60 )

- - - -

(5)

Der korrigierte Baum:(eine weitere, korrekte L¨osung gibt es nicht) t r e e - -+

v - - - -

+ - - - -( 54 ) - - - -+

v - - - - v

- - - -

+ - - - - -( 49 ) - - - - -+ + - - - - -( 59 ) - - - - -+

v - - - - v v - - - - v

- - - -

( 6 ) - - - -+ ( 50 ) - - - -+ ( 55 ) - - -+ ( 60 ) - -+

- - - v - - - - v - - - - v - - - - v

- - - -

+ -( 8 ) -+ + -( 52 ) -+ + -( 57 ) -+ + -( 62 )

v - - - v v - - - - v v - - - - v v - - - -

- - - -

( 7 ) ( 9 ) ( 51 ) ( 53 ) ( 56 ) ( 58 ) ( 61 )

- - - -

(6)

Teil IV: Anwendungen

Aufgabe 1: Bin¨ arer Baum am einfachsten Beispiel

1. Aufgabenstellung

Ziel dieser Aufgabe ist die Entwicklung eines einfachen bin¨aren Baums, der in seinen Knoten je einintund einchar-Wert aufnehmen kann. Die Sortierung soll dabei nach der int-Komponente erfolgen.

2. Testdaten

Bei der Wahl der Testdaten greifen wir auf die obige Quizaufgabe zur¨uck, da wir uns ja dort schon Gedanken ¨uber die richtige Ausgabe gemacht haben:

Datens¨atze: (22, ’a’), ( 1, ’b’), ( 6, ’c’), ( 4, ’d’), (-1, ’e’) ( 5, ’f’), (50, ’g’), (10, ’h’), (30, ’i’), (12, ’j’) (60, ’k’)

3. Entwurf

Definiere zun¨achst die Struktur des Knotens, die wir hier mitNODEbezeichnen, sowie einen Zeiger auf selbige, der den Namen NP tr¨agt:

1 t y p e d e f s t r u c t u s e r {

2 int i ;

3 c h a r c ;

4 } DATA , * DP ; // the u s e r d a t a

5

6 t y p e d e f s t r u c t _ n o d e {

7 s t r u c t _ n o d e * left , * r i g h t ; // the a d m i n p a r t

8 D A T A d a t a ; // the u s e r d a t a p a r t

9 } NODE , * NP ;

Vervollst¨andige folgende Funktionsdeklarationen:

Neuen Knoten generieren: NP newNode( int i, char c );

Baum drucken: void prtTree( NP tree );

Knoten einf¨ugen: void insertNode( NP *tree, NP newNode );

4. Kodierung

(7)

Datenstrukturen und Einzeiler:

1 # i n c l u d e < s t d i o . h > // for I / O

2 # i n c l u d e < s t d l i b . h > // for m a l l o c () 3

4 t y p e d e f s t r u c t u s e r {

5 int i ;

6 c h a r c ;

7 } DATA , * DP ; // the u s e r d a t a

8

9 t y p e d e f s t r u c t _ n o d e {

10 s t r u c t _ n o d e * left , * r i g h t ; // the a d m i n p a r t

11 D A T A d a t a ; // the u s e r d a t a p a r t

12 } NODE , * NP ;

13

14 # d e f i n e n e w T r e e () 0 // new t r e e : n u l l p o i n t e r 15 # d e f i n e e m p t y T r e e ( tp ) ( tp == 0) // t e s t on e m p t y t r e e

Knoten erzeugen:

17 NP n e w N o d e ( int i , c h a r c )

18 {

19 NP p = m a l l o c ( s i z e o f ( N O D E ) ) ;

20 if ( p ) // do we h a v e a new n o d e ?

21 {

22 p - > d a t a . i = i ; p - > d a t a . c = c ; // i n i t i a l i z e d a t a 23 p - > l e f t = p - > r i g h t = 0; // i n i t i a l i z e a d m i n

24 }

25 r e t u r n p ;

26 }

Baum drucken:

28 v o i d p r t T r e e ( NP t r e e )

29 {

30 if ( ! e m p t y T r e e ( t r e e ) ) // do we h a v e a t r e e ?

31 {

32 p r t T r e e ( tree - > l e f t ) ; // p r i n t l e f t 33 p r i n t f ( " i =% d c =% c \ n " ,

34 tree - > d a t a . i , tree - > d a t a . c ) ;

35 p r t T r e e ( tree - > r i g h t ) ; // p r i n t r i g h t

36 }

(8)

Knoten einf¨ugen:

39 v o i d i n s e r t N o d e ( NP * tree , NP n e w N o d e )

40 {

41 NP t h i s N o d e ;

42 if ( ! e m p t y T r e e (* t r e e ) ) // ok or z e r o ?

43 {

44 t h i s N o d e = * t r e e ; // to m a k e it e a s i e r

45 if ( newNode - > d a t a . i < t h i s N o d e - > d a t a . i ) 46 i n s e r t N o d e ( & t h i s N o d e - > left , n e w N o d e ) ; 47 e l s e i n s e r t N o d e ( & t h i s N o d e - > right , n e w N o d e ) ;

48 }

49 e l s e * t r e e = n e w N o d e ; // r e p l a c e the n u l l p o i n t e r

50 }

Hilfsfunktion zum leichten Einf¨ugen: (if-Abfrage und ggf. Fehlermeldungen):

52 int i n s e r t D a t a ( NP * tree , int i , c h a r c )

53 {

54 NP p = n e w N o d e ( i , c ) ; // g e t t i n g a new n o d e

55 if ( p == 0 ) // ran out of s p a c e ?

56 {

57 f p r i n t f ( stderr , " can ’ t i n s e r t (% d % c ) " ,i , c ) ; 58 f p r i n t f ( stderr , " ; no s p a c e a v a i l a b l e \ n " ) ;

59 }

60 e l s e i n s e r t N o d e ( tree , p ) ; // ok , all c l e a r : -) 61 r e t u r n p != 0; // so , the c a l l e r k n o w s the r e s u l t

62 }

Hilfsfunktion und Hauptprogramm:

64 int m a i n ( int argc , c h a r ** a r g v ) {

65 NP m y T r e e = n e w T r e e () ; // i n i t i a l i z e

66 i n s e r t D a t a ( & myTree , 22 , ’ a ’ ) ; 67 i n s e r t D a t a ( & myTree , 1 , ’ b ’ ) ; 68 i n s e r t D a t a ( & myTree , 6 , ’ c ’ ) ; 69 i n s e r t D a t a ( & myTree , 4 , ’ d ’ ) ; 70 i n s e r t D a t a ( & myTree , -1 , ’ e ’ ) ; 71 i n s e r t D a t a ( & myTree , 5 , ’ f ’ ) ; 72 i n s e r t D a t a ( & myTree , 50 , ’ g ’ ) ; 73 i n s e r t D a t a ( & myTree , 10 , ’ h ’ ) ; 74 i n s e r t D a t a ( & myTree , 30 , ’ i ’ ) ; 75 i n s e r t D a t a ( & myTree , 12 , ’ j ’ ) ; 76 i n s e r t D a t a ( & myTree , 60 , ’ k ’ ) ;

77 p r t T r e e ( m y T r e e ) ; // p r i n t the e n t i r e t r e e

78 r e t u r n 0; // d o n e

Referenzen

ÄHNLICHE DOKUMENTE

Und wenn ich das tue, möchte ich auch nicht Toleranz in Anspruch nehmen müssen - Toleranz würde ja nur bedeuten, dass ich zwar schon was und womöglich begründet dagegen habe,

Computer-gestützte Programme für das Ge- wichtsmanagmeent seien zwar weniger wirk- sam als persönliche Interventionen, aber auf jeden FAll besser als nichts und auch ange- sichts

Ziel dieser Aufgabe ist die Entwicklung eines einfachen bin¨ aren Baums, der in seinen Knoten je ein int und ein char-Wert aufnehmen kann. Die Sortierung soll dabei nach

  Dieser Knoten erzeugt in jedem Frame eine Transformation, die dafür sorgt, daß die lokale z-Achse zum aktuellen Viewpoint zeigt..   axisOfRotation wird im

  Felder mit einem Namen zzz, die den Access-Type exposedField haben, haben implizit den Namen zzz_changed, wenn sie als Ausgabe-Feld verwendet werden, und den Namen set_zzz,

„ Siehe Bild: Für jeden Knoten sind alle Daten links kleiner und alle Daten rechts größer als die Daten des

Für die Beurteilung von abweichenden Situationen wird angenommen, dass sich die Störwirkung in Abhängigkeit der Anzahl Stop &amp; Go Ereignisse verändert. Bei einer minimal

Wenngleich das Konzept quattromodaler Knoten einen gewissen Interpretationsspielraum lässt – so werden etwa die Pipeline, Normal- und Breitspur sowie die Binnen- und