Rekursive Baumerstellung



  • Wie wäre es dann richtig?



  • Anders.



  • arnas schrieb:

    Wie wäre es dann richtig?

    Pauschal fährst du ganz gut, wenn du führende Unterstriche sowie doppelte Unterstriche grundsätzlich vermeidest. Bezeichner mit doppelten Unterstrichen sind grundsätzlich der Implementierung vorbehalten, Bezeichner mit führenden Unterstrichen unter bestimmten Bedingungen auch.

    Bevor jetzt ein Klugscheißer daher kommt, der die Regeln ganz exakt kennt: das ist restriktiver als der Standard, aber es ist leichter zu merken und tut nicht weh.



  • Ich hasse diese Witzbolde in dem Forum.
    Schreibt doch immer gleich RTFM.

    Erst passiert mir das mit SeppJ und jetz machts Pi auch net besser...

    Für Arnas:

    (However, names starting with one or two underscores, such as _GRANDFATHER_H and __GRANDFATHER_H, are reserved to the implementation and must not be used by the user.[1][2])

    Einfach führende Unterstriche weglassen.



  • pumuckl schrieb:

    arnas schrieb:

    Wie wäre es dann richtig?

    Pauschal fährst du ganz gut, wenn du führende Unterstriche sowie doppelte Unterstriche grundsätzlich vermeidest. Bezeichner mit doppelten Unterstrichen sind grundsätzlich der Implementierung vorbehalten, Bezeichner mit führenden Unterstrichen unter bestimmten Bedingungen auch.

    Bevor jetzt ein Klugscheißer daher kommt, der die Regeln ganz exakt kennt: das ist restriktiver als der Standard, aber es ist leichter zu merken und tut nicht weh.

    Ok, danke. Werde die Include Guards von _TREE_H_ auf TREE_H ändern.



  • RTFM



  • arnas schrieb:

    Ein weiteres Problem ist, dass ich notwendigerweise nur die Parameter verwenden darf: nr_child_nodes und tree_depth. Ich weiß nicht wie ich damit eine rekursive Funktion erstellen kann, denn wenn ich einen Zeiger auf einen Knoten als Parameter hätte, wäre das wiederum kein Problem, das würde dann ungefähr so wie bei der Tiefensuche funktionieren (statt zu suchen, fügt man Knoten hinzu).

    Dann mach es mit einer rekursiven Hilfsfunktion, die du von create_complete_tree aus aufrufst.



  • Bashar schrieb:

    arnas schrieb:

    Ein weiteres Problem ist, dass ich notwendigerweise nur die Parameter verwenden darf: nr_child_nodes und tree_depth. Ich weiß nicht wie ich damit eine rekursive Funktion erstellen kann, denn wenn ich einen Zeiger auf einen Knoten als Parameter hätte, wäre das wiederum kein Problem, das würde dann ungefähr so wie bei der Tiefensuche funktionieren (statt zu suchen, fügt man Knoten hinzu).

    Dann mach es mit einer rekursiven Hilfsfunktion, die du von create_complete_tree aus aufrufst.

    Die Funktion soll den Knoten doch erstellen, nicht als Argument erhalten. Die Lösung ist so einfach, dass ich sie einfach posten muss:

    node* create_complete_tree(unsigned int nr_child_nodes, unsigned int tree_depth)
    {
    	std::auto_ptr<node> result(new node(whatever));
    	if (tree_depth)
    	{
    		for (unsigned i = 0; i < nr_child_nodes; ++i)
    		{
    			std::auto_ptr<node> child(
    				create_complete_tree(nr_child_nodes, tree_depth - 1));
    
    			//weil add_child werfen kann
    			result->add_child(child.get());
    			child.release();
    		}
    	}
    	return result.release();
    }
    

    Ist die Aufgabe so gemeint?
    Natürlich sollte die Funktion unique_ptr<node> oder so zurückgeben, aber nichts geht über gute alte Ausnahmefrickelei.



  • Bashar schrieb:

    arnas schrieb:

    Ein weiteres Problem ist, dass ich notwendigerweise nur die Parameter verwenden darf: nr_child_nodes und tree_depth. Ich weiß nicht wie ich damit eine rekursive Funktion erstellen kann, denn wenn ich einen Zeiger auf einen Knoten als Parameter hätte, wäre das wiederum kein Problem, das würde dann ungefähr so wie bei der Tiefensuche funktionieren (statt zu suchen, fügt man Knoten hinzu).

    Dann mach es mit einer rekursiven Hilfsfunktion, die du von create_complete_tree aus aufrufst.

    In meiner Aufgabenstellung heißt es, dass create_complete_tree selbst rekursiv sein soll. So wie ich das verstehe, darf man eben keine solche Hilfsfunktion verwenden... Das ist ja das ganze Problem.



  • Wenn der Knoten nun mit der Funktion erstellt wurde, kann man diesen doch sicher auch mit einer Überladung des <<-Operators ausgeben. Ich habe das mal versucht, aber ich scheine auf fehlerhafte Speicherbereiche zuzugreifen, da ich nichts brauchbares erhalte.

    [cpp]std::ostream& operator<<(std::ostream& s, Node* n)
    {
    return s << n->get_name();
    }[code]

    Ausgabe macht sowas wie: 0FA513...

    Jemand noch eine Idee, wie man mir da helfen könnte? Suche brachte mir keine Ergebnisse.


Anmelden zum Antworten