Binärer Suchbaum -> Anzahl der Blätter, Höhe



  • Hallo zusammen!

    Muss übermorgen eine C++ Klausur schreiben und bin noch recht planlos!
    Versuche eine Funktion zu schreiben, die die Anzahl der Blätter eines binären Suchbaums angibt.

    Ausgehend von:

    struct BinBaumKnoten {
    int nutzinfo;
    BinBaumKnoten *lSohn, *rSohn;

    habe ich Folgendes:

    int anzahlBlaetter (BinBaumKnoten *b){
    if (b==NULL) return 0;
    if (b-> rSohn != NULL && b-> lSohn != NULL) return O;
    else return 1 + anzahlBlaetter(b->rSohn) + anzahlBlaetter(b->lSohn)
    }

    das macht aber irgendwie was Falsches^^
    Ich hoffe jemand kann mir helfen!

    Und zu guter Letzt: Ich versuche auch eine Funktion zu schreiben, die die Höhe eines binären Suchbaumes angibt! Da hab ich ma gar keine Ahnung.
    Danke schon mal im vorraus!



  • Hi,

    in deinem zweiten if ist etwas verkehrt 😉 Schau mal auf das if da drüber.
    Btw: Im Magazin gibts nen Artikel über Bäume.

    Edit: Du darfst auch nur in dein "Blatt" runtergehen, falls es existiert, unabhängig von dem Nachbar-Blatt.
    Edit2: Ach wird ja abgefangen 😉



  • wahrscheinlich ist O != 1 😉
    Die Höhe kriegt man auch rekursiv: Ein leerer Baum hat die Höhe 0, alle anderen Bäume haben die Höhe 1 + Maximum(Höhe(links), Höhe(rechts))



  • unsigned anzahlBlaetter (const BinBaumKnoten* b)
    {
        if (b == 0)
            return 0;
        if (b->rSohn == 0 && b->lSohn == 0)
            return 1;
        return anzahlBlaetter(b->rSohn) + anzahlBlaetter(b->lSohn);
    }
    
    unsigned hoehe(const BinBaumKnoten* b)
    {
        if (b == 0)
            return 0;
        return 1 + std::max(hoehe(b->lSohn), hoehe(b->rSohn));
    }
    

    Rekursiv denken 😉



  • Ah cool, Leute das hilft schon mal!
    Besten Dank! Bin jetz aber noch auf ein weiteres Problem gestossen^^ hehe
    passt zwar nicht zu den Bäumen, aber ich schreibs trotzdem mal hier rein:

    Ich versuche, ausgehend von dieser Struktur / verketteten Liste:

    struct ListElem {
    int inhalt;
    ListElem* weiter;
    };

    eine Funktion zu schreiben, die ein beliebiges Element, bzw. eins was man sich dann aussuchen kann, löscht. Das hab ich bereits hingebracht:

    loeschenAnPos (ListElem* liste, int pos){
    if (liste == NULL)
    return 0;
    if (pos == 1){
    ListElem * a = new ListElem;
    a = liste -> weiter;
    delete liste;
    return a;
    }
    }
    So also der Fall, falls es an erster Stelle ist, hätt ich dann^^ aber wie könnt es weiter gehen 😕 ?
    Hoffe hier kann mir genauso gut geholfen werden.
    Danke



  • Listenelement *Entferne (int i, Listenelement *L)
    {
    if (L == NULL)
    return L;
    else if (L ->Nutzinfo == i)
    return L->weiter;
    else {
    L->weiter = Entferne (i, L->weiter);
    return L;
    }
    }



  • Danke für die Anregung!


Anmelden zum Antworten