C
So ich hab auch noch ein paar andere Programme zu binären Bäumen mal geschrieben:
Vielleicht hilft das einigen Leuten ja weiter !!
// Alexander Gilbert
// 15.02.2005
// Binärer Baum
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/* Die Zeiger auf die Struktur selbst, dienen zur Orientierung wegen links und rechts */
struct knoten
{
int wert;
struct knoten *links;
struct knoten *rechts;
};
typedef struct knoten KNOTEN;
void zeige_baum(KNOTEN *zeiger);
/* Globale Variable: kann man auch in jeder Funktion und im Haupt-
programm extra definieren */
int zahl;
KNOTEN *einordnen(KNOTEN *zeiger)
{
/* Wenn der Zeiger noch keine Speicheradresse hat, also nirgends hinzeigt,
dann, wird erstmal Speicher allokiert. */
if(zeiger == NULL)
{
/* Zeiger allokiert knotenweise Speicher. Dies bedeutet im Klartext,
dass durch (KNOTEN *) der Zeiger drei Werte hat. Beispiel bei Eingabe
von der Zahl 1 (1, NULL, NULL). */
zeiger=(KNOTEN *)malloc(sizeof(KNOTEN));
if(zeiger == NULL)
{
printf("Konnte keinen Speicherplatz "
"reservieren!!!\n");
exit (0);
}
/* Der Wert der Zahl, die man eingegeben hat, wird an die Struktur weitergegeben. Rechts
wird dem wird ein leere Speicheradresse zugeordnet und auf der linken Seite wird der Zeiger
als Speicheradressenhalter benutzt. */
zeiger->wert=zahl;
zeiger->links=zeiger->rechts=NULL;
}
/* Wenn die "zahl" kleiner ist als der Wert auf den der Zeiger zeigt, dann ordnet man
die Zahl auf die linke Seite ein. Wenn die "zahl" größer ist, dann ordnet man sie in die
rechte Seite ein. */
else if(zeiger->wert >= zahl)
{
zeiger->links=einordnen(zeiger->links);
}
else if(zeiger->wert < zahl)
{
zeiger->rechts=einordnen(zeiger->rechts);
}
return (zeiger); /* Der Zeiger wird zurückgegeben mit der Speicheradrese */
}
int main()
{
KNOTEN *wurzel=NULL; /* am Anfang hat man noch keine Wurzel und
braucht auch daher keine Speicheradresse in diesem Fall. Aus diesem
Grund vergibt man auch den Begriff NULL an *wurzel. */
printf("*** Dieses Programm zeigt ihnen die Funktionsweise eines binaeren Baumes ***\n");
do
{
printf("Bitte Zahl eingeben : ");
scanf("%d",&zahl);
wurzel = einordnen(wurzel);
}
while(zahl != 0);
getch();
zeige_baum(wurzel); /* man startet von der Wurzel ab durch den Baum */
getch();
return 0;
}
/* Baumstruktur zeigen */
void zeige_baum(KNOTEN *zeiger)
{
/* Wenn der Zeiger eine Speicheradresse hat, dann kann erst ausgeführt
werden. Dabei verwendet man Rekursion, damit die Funktion immer wieder aufge-
rufen werden kann, um auch die Werte, die auf dem linken und rechten Ast
liegen auszugeben. */
if(zeiger != NULL)
{
printf("\n%d->",zeiger->wert);
zeige_baum(zeiger->links); // Rekursion
zeige_baum(zeiger->rechts); // Rekursion
}
}