binäre Bäume (programmieren in C)

  • hallo Leute, Ich hoffe auf euere Hilfe
    meine Aufgabe lautet:
    [highlight] Implementieren Sie die nötigen Funktionen, um sortierte binäre Bäume verwenden zu können.Dafür ist zum einen die Datenstruktur zu deklarieren, und zum anderen sind Funktionen zum Einfügen von Knoten/Blättern und zur Ausgabe des Baumes erforderlich. Informieren Sie sich über die Möglichkeiten einen Suchbaum auszugeben und implementieren Sie Funktionen, dieden Baum in Preorder, Postorder und Inorder ausgeben.
    Implementieren Sie zusätzlich die in der Vorlesung vorgestellte Suche in Binärbäumen rekursiv
    und iterativ. Legen Sie zum Testen einen Baum an und fügen Sie 12 Werte hinzu. Nutzen Sie dann die Funktionen um nach einem Knoten
    zu suchen und den Baum auszugeben. [highlight]

    mein Problem ist mit REKURSIV und mit mit verschiednen ORDER klappt es nicht so gut.
    ich zähle auf euere Hilfe

    Ich habe nicht viel Ahnung von Programmieren, deshalb habe ich zwar angefangen aber das nicht noch nicht so toll aus.

    Das Programm kann nur zahlen speichern un wieder geben.
    mein code lautet foldendermassen:

  • Zur Ausgabe: Warum übergibst du einruecken als Pointer?
    Nimm doch einfach ein "unsigned int". Der Pointer bringt gar nichts außer Verlangsamung und mehr Code. Du brauchst mit einem einfachen "unsigned int" weder zu dekrementieren noch zu dereferenzieren. Als Standard-Wert kannst du für einruecken dann die 0 wählen und der Aufruf gestaltet sich einfacher.
    Und Inorder und Postorder, da musst du nur das printf verschieben.

    Zum Einfügen:
    Schreib Casts wenn möglich nicht hin. Bei dir wird z.B. gar nicht gecastet, auch wenn du es dahin schreibst. Die Schreibweise "for(;;)" ist anti-intuitiv, verwende lieber "while(1)".

    Rekursion:
    Einfügen:
    Wenn knoten == NULL: knoten := neuer wert
    Wenn knoten >= wert: Einfügen(knoten->links, wert)
    Sonst: Einfügen(knoten->rechts, wert)
    Suchen:
    Wenn knoten == NULL: Nicht gefunden
    Wenn knoten == wert: Knoten gefunden
    Wenn knoten >= wert: Suche(knoten->links, wert)
    Sonst: Such(knoten->rechts, wert)

    Die Frage ist noch, ob du Doppeleinträge zulassen möchtest.

    Was studierst du denn?

    Viele liebe Grüße
    The User

  • Danke für die Hilfe...
    Ich studiere Informatik an der TU Aachen, 7. Semester...

  • möchte mich von den harten, ungerechten aussagen der vorposter distanziern... meilenweit
    bin der hilfe dankbar...
    kennt ihr noch ein weiteres gutes forum besonders für c++?

  • Hallo,
    Ich habe preorder eingebaut, aber ich bekomme nichts ausgegeben. kann jemand mir bitte tipps geben...


    hier ist der code:

    struct binaer_knoten{
    int ZAHL;
    struct binaer_knoten *links;
    struct binaer_knoten *rechts;
    };

    void baum_ausgeben (struct binaer_knoten * wurzel)
    {
    int i;

    if (wurzel != NULL) /* Ist der Baum leer? Nein, dann gib ihn aus */
    {


    printf("%d\n",wurzel->ZAHL); /* Preorder-Notation: W */

    baum_ausgeben(wurzel->links); /* Preorder-Notation: L */
    baum_ausgeben(wurzel->rechts); /* Preorder-Notation: R */

    }
    return;
    };
    ......
    ......


    int main(void) {
    .....
    baum_ausgeben(re->wurzel);


    meine freage ist: wie muss ih das in main() funktion arbeiten

  • Nimm %i statt %d. (denn es ist ja ein Integer)
    Ansonsten fehlt noch die Einrückungstiefe. Entweder du übergibst die als int, oder aber du übergibst gleich eine Zeichenkette mit der gewünschten Anzahl an Leerzeichen. Im ersten Fall muss der Standardwert 0 sein (void baum_ausgeben (struct binaer_knoten * wurzel, int indent = 0)), im zweiten Fall "" (void baum_ausgeben (struct binaer_knoten * wurzel, const char * indent = ""). Im ersten Fall musst du nach dem printf inkrementieren, im zweiten Fall ein " " dranhängen (dafür gibt es eine Funktion in string.h).

    Grüße
    The User

    PS:
    Nach 17 Minuten brauchst du deinen Thread doch noch nicht zu pushen, dadurch wird der auch nicht besser sichtbar. Wenn du etwas editieren möchtest, registriere dich am besten, dann geht das.

  • Vielen Dank!
    meine Funktion sieht jetzt folgendermaßen aus:

    void baum_preorder (struct binaer_knoten * wurzel, int *einruecken)
    {
    int i;

    if (wurzel != NULL) /* Ist der Baum leer? Nein, dann gib ihn aus */
    { for(i=0;i<=(*einruecken);i++)
    printf(" ");


    printf("%i\n",wurzel->ZAHL); /* Preorder-Notation: W */
    (*einruecken)++;
    baum_preorder(wurzel->links, einruecken); /* Preorder-Notation: L */

    baum_preorder(wurzel->rechts, einruecken); /* Preorder-Notation: R */
    (*einruecken)--;
    }
    return;
    };

    habs folgendermaßen in die main-Funktion eingebaut:

    int main(void) {
    struct binaer_baum *re;
    ...
    else if(wahl==4){
    baum_preorder(re,"");
    }

    Das Problem besteht darin, dass mir das Programm nur eine unsinnige ZAhl ausgibt. Woran könntge das liegen?

  • Du übergibst "" für einen int-Pointer.
    Das ist ja wohl Mist. Entscheide dich für eine Variante: Entweder int oder Zeichenkette. Und in keinem Fall int-Pointer.
    Du solltest mal auf Warnungen deines Compilers achten. (bei gcc kannst du die Option -Wall verwenden) Außerdem ist das <= Quatsch, nimm !=, wenn du ints verwendest.
    Wenn dann immer noch komische Zahlen kommen, liegt das vermutlich daran, dass du die Werte im Baum nicht richtig initialisierst.

    Und jetzt klärst du uns bitte auch einmal über kingpump auf, der mit der selben IP wie du hier sinnlosen Schrott schreibt, bist du das?

  • Komischerweise taucht diese Aufgabe mit demselben Wortlaut auch bei der TU Hannover im 1. Semester vieler Ingenieursstudiengänge als Grundlagen der Informatik auf...