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!