1 Darstellung von Informationen/Daten im Rechner

Werbung
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
Herunterladen