Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen 10.1 Traversieren binärer Bäume Unter Traversieren (vgl. Vorlesungs-Skript Kapitel 15.3.2) versteht man das Durchlaufen aller Knoten eines Baumes nach einer bestimmten Reihenfolge. Es gibt im wesentlichen drei Reihenfolgen, die wie die Baumstruktur selbst, zweckmäßigerweise rekursiv definiert sind. Im folgenden Bild stellt K ein Knoten, A und B den linken und rechten Teilbaum dar. K A B Es ergeben sich die drei Reihenfolgen: 1. Preorder: K, A, B (besuche K vor Teilbäumen) 2. Inorder: A, K, B (besuche zuerst den linken Teilbaum, dann den Knoten und zuletzt den rechten Teilbaum) 3. Postorder: A, B, K (besuche K nach den Teilbäumen) Gegeben sei der binäre Baum aus Aufgabe 9.1. 10 7 3 Kochs Limbourg Simons 9 8 13 Günther Lücke 11 Stockmanns Dada 18 Petersen Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen Passend zu dem C-Code aus Aufgabe 9.1 werden die folgende Funktionen implementiert: /* Preorder Traversieren eines Baumes. */ void preorder(KNOTEN *k) { if(k) { printf("("); printf("%i,", k->PersonalNummer); preorder(k->links); preorder(k->rechts); printf(")"); } else { printf("NULL,"); } } /* Inorder Traversieren eines Baumes. */ void inorder(KNOTEN *k) { if(k) { printf("("); inorder(k->links); printf("%i,", k->PersonalNummer); inorder(k->rechts); printf(")"); } else { printf("NULL,"); } } /* Postorder Traversieren eines Baumes. */ void postorder(KNOTEN *k) { if(k) { printf("("); postorder(k->links); postorder(k->rechts); printf("%i", k->PersonalNummer); printf(")"); } else { printf("NULL,"); } } Geben Sie die verschiedenen Ausgaben der drei Funktionen an (Zustand des Baumes vor dem Löschen!). Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen Lösung: /* Ausgabe */ Preorder Darstellung: (10,(7,(3,NULL,NULL,)(9,(8,NULL,NULL,)NULL,))(13,(11,NULL,NULL,)(18,NULL,NULL,))) Inorder Darstellung: (((NULL,3,NULL,)7,((NULL,8,NULL,)9,NULL,))10,((NULL,11,NULL,)13,(NULL,18,NULL,))) Postorder Darstellung: (((NULL,NULL,3)((NULL,NULL,8)NULL,9)7)((NULL,NULL,11)(NULL,NULL,18)13)10) Aufschlüsselung der Darstellungen: Die indirekten Knoten werden mit K* dargestellt. Die K* werden dann anschließend von unten nach oben eingesetzt. Preoder: ( K, A, B ) ( 10, 7*, 13* ) 7*: ( 7, 3*, 9* ) 13*: ( 13, 11*, 18* ) 3*: ( 3, NULL, NULL ) 11*: ( 11, NULL, NULL ) 9*: ( 9, 8*, NULL ) 18*: ( 18, NULL, NULL ) 8*: ( 8, NULL, NULL ) Indorder: ( A, K, B ) ( 7*,10 ,13* ) 7*: ( 3*, 7, 9* ) 13*: ( 11*, 13, 18* ) 3*: ( NULL, 3, NULL ) 11*: ( NULL, 11, NULL ) 9*: ( 8*, 9, NULL ) 18*: ( NULL, 18, NULL ) 8*: ( NULL, 8, NULL ) Postorder: ( A, B, K ) ( 7*, 13*, 10 ) 7*: ( 3*, 9*, 7 ) 13*: ( 11*, 18*, 13 ) 3*: ( NULL, NULL, 3 ) 11*: ( NULL, NULL, 11 ) 9*: ( 8*, NULL, 9 ) 18*: ( NULL, NULL, 18 ) 8*: ( NULL, NULL, 8) Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen 10.2 Traversieren (für zu hause) Gegeben sei nun folgender arithmetischer Ausdruck: ( a * ( b – c ) – d ) / ( e + f * ( g + h ) ). a) Erstellen Sie für den Ausdruck einen binären Baum. Die Wurzel und jeder innere Knoten hat als Inhalt eine Operation (*, /, ...), jedes Blatt einen Operator (a, b, ...). b) Geben Sie die Ausgabe der drei Funktionen für diesen Baum an. Preorder: (/,(-,(*,(a,NULL,NULL,)(-,(b,NULL,NULL,)(c,NULL,NULL,)))(d,NULL,N ULL,))(+,(e,NULL,NULL,)(*,(f,NULL,NULL,)(+,(g,NULL,NULL,)(h,NULL,NUL L,))))) Inorder: ((((NULL,a,NULL,)*,((NULL,b,NULL,)-,(NULL,c,NULL,)))-,(NULL,d,NUL L,))/,((NULL,e,NULL,)+,((NULL,f,NULL,)*,((NULL,g,NULL,)+,(NULL,h,NUL L,))))) Postorder: ((((NULL,NULL,a)((NULL,NULL,b)(NULL,NULL,c)-)*)(NULL,NULL,d)-)( (NULL,NULL,e)((NULL,NULL,f)((NULL,NULL,g)(NULL,NULL,h)+)*)+)/) c) Entwickeln Sie nun passende Ausgabefunktionen (Pre-, In- und Postorder) und geben Sie die entsprechende Ausgabe an. Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen Lösung: zu a): / - + * d a - b e * f c + g Zu b): /* Ausgabe */ Preorder Darstellung: Inorder Darstellung: Postorder Darstellung: / - * a - b c d + e * f + g h a * b - c - d / e + f * g + h a b c - * d - e f g h + * + / zu c): /* kompletter Quellcode für den arithmetischer Ausdruck als Baum */ /* traversieren2.c */ #include<stdlib.h> #include<stdio.h> #include<string.h> /* Deklaration eines Knotens */ typedef struct knoten { char inhalt; struct knoten *links; struct knoten *rechts; } KNOTEN; /* Prototypen */ h Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen KNOTEN *knotenErzeugen(char, KNOTEN*, KNOTEN*); void preorder(KNOTEN *); void inorder(KNOTEN *); void postorder(KNOTEN *); /* Hauptprogramm */ void main(void) { KNOTEN *wurzel = NULL; wurzel = knotenErzeugen('/', knotenErzeugen('-', knotenErzeugen('*', knotenErzeugen('a', NULL, NULL), knotenErzeugen('-', knotenErzeugen('b', NULL, NULL), knotenErzeugen('c', NULL, NULL) ) ), knotenErzeugen('d', NULL, NULL) ), knotenErzeugen('+', knotenErzeugen('e', NULL, NULL), knotenErzeugen('*', knotenErzeugen('f', NULL, NULL), knotenErzeugen('+', knotenErzeugen('g', NULL, NULL), knotenErzeugen('h', NULL, NULL) ) ) ) ); printf("\nPreorder Darstellung:\t"); preorder(wurzel); printf("\nInorder Darstellung:\t"); inorder(wurzel); printf("\nPostorder Darstellung:\t"); postorder(wurzel); printf("\n"); return; } KNOTEN *knotenErzeugen(char inhalt, KNOTEN *linkerSohn, KNOTEN *rechterSohn) { KNOTEN *neu = (KNOTEN*)malloc(sizeof(KNOTEN)); if(neu == NULL) { /* Ausgabe: Speicherüberlauf und Beenden des Programms */ printf("Speicherüberlauf\n"); exit(1); } neu->inhalt = inhalt; neu->links = linkerSohn; neu->rechts = rechterSohn; return neu; } /* Preorder Traversieren eines Baumes. */ void preorder(KNOTEN *k) { if (k) { printf(" %c",k->inhalt); Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen preorder(k->links); preorder(k->rechts); } } /* Inorder Traversieren eines Baumes. */ void inorder(KNOTEN *k) { if (k) { inorder(k->links); printf(" %c",k->inhalt); inorder(k->rechts); } } /* Postorder Traversieren eines Baumes. */ void postorder(KNOTEN *k) { if (k) { postorder(k->links); postorder(k->rechts); printf(" %c",k->inhalt); } } Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen 10.3 Umwandlung eines Vielwegbaums in einen binären Baum Ein Vielwegbaum läßt sich nach einem einfachen Algorithmus in einen Binärbaum umwandeln. Der Algorithmus beruht auf der Beobachtung, dass jeder Knoten eines geordneten Baumes eine Liste von Söhnen besitzt, die als Nachfolger und rechter Bruder bzw. rechte Brüder dargestellt werden können. Der linke Verweis zeigt auf den ersten direkten Nachfolger und der rechte Verweis auf den Bruder, der wiederum auf den nächsten Bruder (bei mehreren Söhnen) verweist usw. Beispielsweise gilt: Vielwegbaum 1 1 2a 2b 3a Binärbaum 2a 2b 3b 3a 3b Wandeln Sie mit Hilfe des oben angegebenen Algorithmus folgenden Baum um. Institut für Angewandte Materialtechnik Abteilung für Angewandte Materialtechnik Fakultät für Gesellschaftswissenschaften Institut für Informations- u. Medientechnik und TechnikDidaktik Instittut für Technologien der Informationstechnik Abteilung für Informations-, Medientechnik und Informatik Fakultät für Geisteswissenschaften Institut für elek. Energie- und Automatisierungstechnik Fakultät für Naturwissenschaften Abteilung für Maschinenbau Institut für Nachrichten- und Kommunikationstechnik Fakultät für Wirtschaftswissenschaften Universität Duisburg Institut für Mikroelektronik und Medizintechnik Abteilung für Elektrotechnik Fakultät für Ingenieurwissenschaften Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen Institut für Angewandte Materialtechnik Abteilung für Angewandte Materialtechnik Fakultät für Gesellschaftswissenschaften Institut für Informations- u. Medientechnik und TechnikDidaktik Institut für elek. Energie- und Automatisierungstechnik Fakultät für Naturwissenschaften Abteilung für Maschinenbau Institut für Nachrichten- und Kommunikationstechnik Fakultät für Wirtschaftswissenschaften Instittut für Technologien der Informationstechnik Abteilung für Informations-, Medientechnik und Informatik Fakultät für Geisteswissenschaften Universität Duisburg Institut für Mikroelektronik und Medizintechnik Abteilung für Elektrotechnik Fakultät für Ingenieurwissenschaften Arbeitsblätter zur Übung – Informatik 2 / GTI 2 - Algorithmen und Datenstrukturen