Binärbaum mit n-i Verzweigungen?



  • Hey_
    Wie kann man in ANSI C eigendlich einen Binärbaum basteln der erst 5 Verzweigungen hat und diese dann 4 mal verzweigen u.s.w.?



  • Optimiezer schrieb:

    [...]einen Binärbaum [...] 5 Verzweigungen[...]

    😕



  • Na anstelle der beiden Zeiger links/rechts (beim Binärbaum) machst du jetzt halt n Zeiger auf die Kinder. Z.B. so:

    struct tree {
        T data;
        size_t n_children;
        struct tree **children;
    };
    


  • binär (v. lat. bini, „je zwei“ bzw. bina, „paarweise“)

    Dann ist es leider nur noch ein Baum.



  • Euren Aussagen entnehme ich mal das die Binärbäume Binärbäume heißen weil sie 2 Kinder haben.
    Also entweder bin ich dumm oder... ich verstehe nicht wie mir deine tree struktur helfen kann...
    Könntest du das für mich vll noch ein bisschen ausführen?



  • willst du nen baum oder nen "BINÄR" baum???

    BINÄRBAUM:

    struct tree {
        T data; //Daten des knten
        struct tree *pRightChild;
        struct tree *pLeftChild;
    };
    

    BAUM:

    struct tree {
        T data; //Daten des knten
        unsigned int iChilds;
        struct tree **pLeftChild; (Pointer of array of Childs)
    };
    


  • Also: ein Binärbaum hat immer(maximal) 2 Kinder. Ein "allgemeiner" Baum kann mehr haben je nach Definition.

    Wenn Du einen Baum mit 5 Kindern definierst dann hat der eben 5 Kinden.
    In der Struktur des Baums im voriren Posting ist mit

    struct tree **pLeftChild;
    

    ein die Möglichkeit gegeben beliebig viele Kinder einzusetzen.
    Mit

    struct tree Childs[5];

    erzeugst Du genau 5 Kinder erzeugen.

    Vielleicht könntest Du mal Deine Aufgebenstellung erläutern, evtl kann man das anders lösen. Denn ein Baum mit 5 und dann mit 4 Kindern ist ehr ungewöhnlich und müsste wohl von dir ausprogrammiert werden.



  • Zu dem Baum mit den beliebig vielen Kindern:

    struct tree {
        T data; //Daten des knten
        unsigned int iChilds;
        struct tree **pLeftChild; (Pointer of array of Childs)
    };
    

    Hier musst du mit malloc() ein Array anlegen.

    struct tree *t = malloc(sizeof(*t));
        t->iChilds = 5;
        t->pLeftChild = malloc(t->iChilds*sizeof(struct tree*));
    

    damit ist

    t->pLeftChild[0] : Zeiger auf das erste Kind
        t->pLeftChild[1] : Zeiger auf das zweite Kind
    ...
        t->pLeftChild[t->iChilds-1] : Zeiger auf das letzte Kind
    

    Ist das nun klar? oder hast du noch weitere Fragen?

    Gruß mcr

    PS: zu jedem malloc brauchst du ein free() um den Speicher wieder freizugeben,
    wenn du ihn nicht mehr brauchst.



  • ach so, mit einem dynamischen Array. Jetzt habe ich es verstanden,
    dank euch allen


Anmelden zum Antworten