Binary Tree



  • Skym0sh0 schrieb:

    was ist denn ein binärbaum mit mathematischen operationen??

    Du kannst Bäume nicht nur zum Suchen verwenden, sondern auch als Syntaxbaum zur Darstellung von arithmetischen Ausdrücken 😉

    @Max: Wie würdest du den Wert eines Produktes denn manuell angeben? Genauso kannst du das auch im Programm erledigen. Den Wert der Faktoren holst du dir, indem du (rekursiv) die beiden Kinder danach fragst.



  • Okey, also ich multipliziere in der compute()-Methode die Kinder miteinander - was aber soll die expressions()-Methode? :S



  • achso, das meint er

    ok... schon klar 🙂



  • MaxC++ schrieb:

    Okey, also ich multipliziere in der compute()-Methode die Kinder miteinander - was aber soll die expressions()-Methode? :S

    Wenn ich raten müsste, würde ich sagen: Den berechneten Ausdruck in Textform (d.h. als "faktor1 * faktor2" darstellen. Die Aufgabe solltest du eigentlich auf dies selbe Weise lösen können wie die Berechnung - die Teilausdrücke der Faktoren holen und daraus deinen eigenen Ausdruck zusammenbauen. Du mußt nur darauf achten, daß du nicht mit der "natürlichen" Operator-Rangfolge (Punktrechnung vor Strichrechnung) in Konflikt kommst.



  • Ah, also kann man unter "expression" einfach das Berechnete in Textform ausgegben - guuut 🙂
    Zur compute()-Methode: Kann ich das nicht "einfach" so machen:

    float multiplication_node::compute() const
    {
        return _left->compute() * _right->compute();
    }
    


  • MaxC++ schrieb:

    Ah, also kann man unter "expression" einfach das Berechnete in Textform ausgegben - guuut 🙂

    Ich kenne zwar deine Anforderungen nicht, aber vermutlich sollst du eher die Rechenvorschrift ausgeben als das Ergebnis des compute()-Aufrufes.

    Zur compute()-Methode: Kann ich das nicht "einfach" so machen:

    float multiplication_node::compute() const
    {
        return _left->compute() * _right->compute();
    }
    

    Klar, so hätte ich es auch gemacht.



  • Super 🙂

    ..zu 1: Also nicht sowas?

    return std::string(_left->compute() + " * " + _right->compute());
    


  • Nicht ganz - aber die Kind-Knoten sollten doch auch eine expression)-Methode anbieten.

    PS: Und ich würde lieber zu viele Klammern setzen als zu wenige - (1+2)*3 ist etwas anderes als 1+2*3



  • Ahh 😃
    Alles klar 🙂

    Noch eine Schlussfrage: Ich habe noch ein arithmetic_tree file, das die Methoden evaluate() und expression() enthält. Expression() ist mir nun klar, aber was soll die evaluate()-Methode machen?

    Zudem habe ich noch ein value_node-file, das die Methode compute() enthält. Doch was soll die noch "computen"? 🙂



  • Was diese Methoden tatsächlich machen sollen, dürfte eigentlich in deiner Aufgabenstellung stehen. Ich kann hier nur auf Basis der Namen Vermutungen anstellen.

    MaxC++ schrieb:

    Noch eine Schlussfrage: Ich habe noch ein arithmetic_tree file, das die Methoden evaluate() und expression() enthält. Expression() ist mir nun klar, aber was soll die evaluate()-Methode machen?

    Den Wert bzw. Ausdruck des Gesamtbaumes zurückgeben (d.h. ein Aufruf von root->compute()

    Zudem habe ich noch ein value_node-file, das die Methode compute() enthält. Doch was soll die noch "computen"? 🙂

    Im Sinne der Polymorphie könnte einer der beiden Kindknoten deines multiplication_node so ein value_node sein, also brauchst du die selben Methoden, damit der rekursive Aufruf _left->compute() bzw. _right->compute() aufgelöst werden kann. Jetzt mußt du dich nur noch fragen, wie du den Wert z.B. der Zahl 7 berechnen würdest 😉



  • Ich habs nun mal so gemacht:

    return _left->compute() * _right->compute() + _value;
    

    ..aber ist das wirklick korrekt?
    So würde ich einfach annehmen, dass _value der "Rest" ist..



  • Nein, der value_node dürfte für die Blätter in deinem Rechenbaum stehen - da sollten beide Kindknoten mit NULL belegt sein und du hast nur den (im Knoten selbst untergebrachten) Wert.

    (PS: nur zur Übung, ob du es verstanden hast: Wie würdest du die addition_node::compute() schreiben?)



  • Wie meinst du das konkret?
    Muss also nur _value returniert werden?

    addition_node::compute() sieht bei mir folgendermassen aus:

    return _left->compute() + _right->compute();
    


  • MaxC++ schrieb:

    Wie meinst du das konkret?
    Muss also nur _value returniert werden?

    Klar, etwas anderes hast du ja nicht.

    (die Addition sieht auch richtig aus)



  • Haha..hast Recht 😉

    Super, besten Dank!
    ..allerdings kann ich _value nicht direkt returnieren, da ja ein string erwartet wird. Gibt's da ne Möglichkeit von typecasting?



  • Casten bringt da nichts, aber Typumwandlung ist schon das richtige Stichwort - die Antwort findet sich bei uns im Archiv: Einmal Zahl nach String und zurück



  • Yeah, vielen herzlichen Dank für die Hilfe! 🙂



  • Mann sollte left und right noch auf Gültigkeit prüfen, bevor man was mit ihnen anstellt.


Anmelden zum Antworten