Tree



  • Okey, vielen Dank!

    Jeps, hab's soweit gemacht. Allerdings hab ich noch zwei Fragen:

    1.) Wenn man sowas hat:
    if( nd )
    return //...
    dann prüft man einfach, ob "nd" vorhanden und korrekt gewählt ist, oder?

    2.)Wie überprüft man, ob es sich um einen external_node (Blattknoten) handelt? ..also wie sieht die Idee dazu aus?



  • MaxC++ schrieb:

    1.) Wenn man sowas hat:
    if( nd )
    return //...
    dann prüft man einfach, ob "nd" vorhanden und korrekt gewählt ist, oder?

    Das ist im Prinzip äquivalent zu if(nd!=NULL)... - und wenn du unbenutzte Zeiger mit NULL vorbelegst, kannst du auf diese Weise prüfen, ob er belegt ist. Mit deinem vector<> kannst du dir die Überprüfung sparen (s.u.)

    2.)Wie überprüft man, ob es sich um einen external_node (Blattknoten) handelt? ..also wie sieht die Idee dazu aus?

    Wie ist denn der Begriff "Blatt" definiert - ein Knoten, der keine Nachfolger hat. Bei deinem Design ist das ganz einfach festzustellen, da alle Nachfolgerknoten in deinem vector<tree_node*> _children; untergrabracht sind.



  • Ahh..und ich dacht' schon, was die "_children" konkret sein sollen. 🤡

    Eine Schlussfrage habe ich noch: Mein Compiler hat bei der tree_height-Methode etwas gejammert. Links- und Rechtsknoten gibt es bei mir ja eigentlich nicht - wie soll ich die Methode denn ohne li- re-Knoten implementieren?



  • Auch über die children-Liste - du bestimmst die Höhe jedes Unterbaums (die einzelnen Kinder können als Wurzeln eines kleineren Unterbaums betrachtet werden), nimmst davon das Maximum und addierst noch 1 (für die Wurzel selber).



  • Okey, also ich hab mal sowas gemacht:

    int tree::height() const
    {
    	return std::max(_children.size()) + 1;    
    }
    

    ..was aber nicht stimmen kann, da: _children ja eigentlich ein private-Argument ist und ich also nicht so direkt darauf zugreifen kann..



  • Nein, so klappt da nicht, du willst schließlich die maximale Höhe der Kinder haben und nicht die Größe der Kinder-Liste. Du mußt schon in einer Schleife über diese Liste laufen:

    int kind_hoehe=0;
    for(int i=0;i<children.size();++i)
      kind_hoehe=std::max(kind_hoehe,children[i]->height();
    return kind_hoehe+1;
    

    (und als nächstes lernen wir dann, wie du das selbe mit den STL-Algorithmen hinbekommst :D)



  • Aber Frage: _children ist in tree_node.hpp private, d.h. dass man ja nicht direkt darauf zugreifen kann..
    (oder?)

    STL-Algo? ..etwas einfacheres? 🙂



  • MaxC++ schrieb:

    Aber Frage: _children ist in tree_node.hpp private, d.h. dass man ja nicht direkt darauf zugreifen kann..
    (oder?)

    Die offensichtlichste Lsung ist dann wohl, diesen Code dorthin zu packen, wo du darauf zugreifen kannst - idealerweise wäre das die Methode tree_node::height().

    STL-Algo? ..etwas einfacheres? 🙂

    Nicht unbedingt einfacher, aber mitunter eleganter. Wenn du mehr darüber wissen willst, im Magazin gibt es noch einen alten Artikel von mir über die STL.



  • Okey, so hats eigentlich funktioniert.
    Nur: Kann ich die Methode in tree.cpp nicht mit
    "tree_node::height()" aufrufen?
    ..ich frage so dumm, weil mein Compiler da leider anderer Meinung ist..

    Gerne, da werd' ich nachher einen Blick rein werfen 🙂



  • Wenn du die Methode aufrufst, mußt du ihr auch sagen, für welches Objekt du sie anwenden willst - die Antwort heißt _root-height().



  • Ahh shit - das hab' ich eben auch gerade raus bekommen.
    ..darauf hätt' ich eigentlich sofort kommen sollen..

    However, jetzt funktioniert alles wie gwünscht 🙂
    Vielen herzlichen Dank für die Unterstützung euch allen! 🙂


Anmelden zum Antworten