<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Verstädnisproblem mit Rekursion]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>ich setze mich zurzeit mit diversen Algorithmen und Datenstrukturen auseinander (Stacks, Trees, Heaps, etc) und habe nun ein Problem eine gewisse Art der Rekursion zu verstehen. Es geht darum, dass man Binary Trees ja mit Traversierungsmethoden ausgeben kann (Preorder, Postorder, Inorder, Levelorder). Schlau ist, wenn man dafür eine Rekursion wie diese hier verwendet:</p>
<pre><code>void preorderPrint( TreeNode *root ) {
           // Print all the items in the tree to which root points.
           // The item in the root is printed first, followed[*] by the
           // items in the left subtree and then the items in the
           // right subtree.
        if ( root != NULL ) {  // (Otherwise, there's nothing to print.)
           cout &lt;&lt; root-&gt;item &lt;&lt; &quot; &quot;;      // Print the root item.
           preorderPrint( root-&gt;left );    // Print items in left subtree.
           preorderPrint( root-&gt;right );   // Print items in right subtree.
        }
     } // end preorderPrint()
</code></pre>
<p>Angenommen, ich hab diesen Baum:<br />
.......1<br />
....../.\<br />
.....2...3<br />
..../.\...\<br />
...4...5...6</p>
<p>dann wäre dies ja in Preorder so: 1 2 4 5 3 6</p>
<p>ich kann diesem Stückchen rekursiven Code da oben leider nur soweit folgen:</p>
<p>ich geh mit dem Wurzel-Knoten (1) rein, weil die if-Bedingung keine Probleme macht, kann ich auf Zeile 7 nun das cout ausführen. Zeile 8 ruft die Funktion rekursiv auf und übergibt den Knoten mit Wert 2 als neuen Wurzel-Knoten. If-Bedingung wieder okay -&gt; cout und ich rufe die Funktion erneut auf. Dieses Mal übergebe ich den Knoten mit dem Wert 4 und mache wieder cout. So was macht das Programm danach? Weil es beim Knoten (4) ja kein left-Child mehr gibt, ist in die linke Richtung ja nichts mehr zu tun. Ich komm irgendwie einfach nicht dahinter, wie die Funktion jetzt 5, 3 und 6 findet. Wird denn die Zeile 8 [preorderPrint( root-&gt;left );] jetzt immer übersprungen?</p>
<p>ich hoffe, mir kann hier jemand ein wenig weiterhelfen.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266460/verstädnisproblem-mit-rekursion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 07:14:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266460.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 May 2010 14:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verstädnisproblem mit Rekursion on Sun, 09 May 2010 14:49:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>ich setze mich zurzeit mit diversen Algorithmen und Datenstrukturen auseinander (Stacks, Trees, Heaps, etc) und habe nun ein Problem eine gewisse Art der Rekursion zu verstehen. Es geht darum, dass man Binary Trees ja mit Traversierungsmethoden ausgeben kann (Preorder, Postorder, Inorder, Levelorder). Schlau ist, wenn man dafür eine Rekursion wie diese hier verwendet:</p>
<pre><code>void preorderPrint( TreeNode *root ) {
           // Print all the items in the tree to which root points.
           // The item in the root is printed first, followed[*] by the
           // items in the left subtree and then the items in the
           // right subtree.
        if ( root != NULL ) {  // (Otherwise, there's nothing to print.)
           cout &lt;&lt; root-&gt;item &lt;&lt; &quot; &quot;;      // Print the root item.
           preorderPrint( root-&gt;left );    // Print items in left subtree.
           preorderPrint( root-&gt;right );   // Print items in right subtree.
        }
     } // end preorderPrint()
</code></pre>
<p>Angenommen, ich hab diesen Baum:<br />
.......1<br />
....../.\<br />
.....2...3<br />
..../.\...\<br />
...4...5...6</p>
<p>dann wäre dies ja in Preorder so: 1 2 4 5 3 6</p>
<p>ich kann diesem Stückchen rekursiven Code da oben leider nur soweit folgen:</p>
<p>ich geh mit dem Wurzel-Knoten (1) rein, weil die if-Bedingung keine Probleme macht, kann ich auf Zeile 7 nun das cout ausführen. Zeile 8 ruft die Funktion rekursiv auf und übergibt den Knoten mit Wert 2 als neuen Wurzel-Knoten. If-Bedingung wieder okay -&gt; cout und ich rufe die Funktion erneut auf. Dieses Mal übergebe ich den Knoten mit dem Wert 4 und mache wieder cout. So was macht das Programm danach? Weil es beim Knoten (4) ja kein left-Child mehr gibt, ist in die linke Richtung ja nichts mehr zu tun. Ich komm irgendwie einfach nicht dahinter, wie die Funktion jetzt 5, 3 und 6 findet. Wird denn die Zeile 8 [preorderPrint( root-&gt;left );] jetzt immer übersprungen?</p>
<p>ich hoffe, mir kann hier jemand ein wenig weiterhelfen.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894694</guid><dc:creator><![CDATA[Airlike]]></dc:creator><pubDate>Sun, 09 May 2010 14:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verstädnisproblem mit Rekursion on Sun, 09 May 2010 14:51:16 GMT]]></title><description><![CDATA[<p>Du startest die Funktion mit dem Wurzelknoten (1). Die if Bedingung trifft zu, der Knoten ist nicht NULL. Also wird der Wert des Knotens (1) und ein Leerzeichen ausgegeben. Anschließend wird die Funktion erneut aufgerufen und es wird der linke Kindknoten (2) übergeben.</p>
<p>Also befindest du dich in der Funktion am Anfang. Der aktuelle Knoten (2) ist nicht NULL, also wird erneut der Wert ausgegeben. Jetzt wird erneut die Funktion mit dem linken Kindknoten aufgerufen (4).</p>
<p>Wieder in der Funktionn, Knoten (4) ist nicht NULL, Ausgabe, aufruf der Funktion mit dem linken Kindknoten (welcher NULL ist).</p>
<p>In der Funktion trifft die IF diesmal nicht zu, da der aktuelle Knoten NULL ist. Die Funktion macht also nichts.</p>
<p>Jetzt bist du in der Zeile 9, aber mit dem Knoten 4, den die Funktion war ja noch nicht zuende. Dort wird jetzt die selbe Funktion mit dem rechten Kindknoten ausgeführt, welcher wieder NULL ist, und die Funktion wieder nichts macht. Die Funktion mit dem Knoten 4 ist nun also fertig.</p>
<p>Jetzt befindest du dich wieder an der Stelle, wo du die Funktion mit dem linken Kindknoten von (2) aufgerufen hast, die Funktion war ja noch nicht fertig. Also rufst du die Funktion erneut auf und übergibst den rechten Kindknoten (5). Das selbe Spiel wie beim Knoten (4) beginnt.</p>
<p>Und so weiter und so weiter...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894701</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sun, 09 May 2010 14:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verstädnisproblem mit Rekursion on Sun, 09 May 2010 15:16:56 GMT]]></title><description><![CDATA[<p>vielen Dank für die ausführliche Erklärung!</p>
<p>Jetzt kann ich der ganzen Sache schon wesentlich besser folgen. Ich frage mich aber noch, wieso die Funktion (nachdem Sie den Knoten (4) gänzlich bearbeitet hat) zum Knoten (2) geht. Merkt sich der Compiler &quot;irgendwie&quot;, dass er dort noch nicht fertig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894714</guid><dc:creator><![CDATA[Airlike]]></dc:creator><pubDate>Sun, 09 May 2010 15:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verstädnisproblem mit Rekursion on Sun, 09 May 2010 15:20:07 GMT]]></title><description><![CDATA[<p>Das hat mit den internen der Funktionsaufrufen zu tun.</p>
<p>Wenn eine Funktion aufgerufen wird, so geschieht folgender relevanter Punkt:<br />
Die Addresse des Codestückes _nach_ dem Aufruf wird auf den Stack gespeichert. Dann wird zu der Addresse der Funktion gesprungen. Wenn die Funktion fertig ist, wird die gespeicherte Addresse vom Stack genommen und zu dieser wird zurückgesprungen.</p>
<p>Oder einfacher gesagt: Ja, der Compiler merkt sich, dass er dort noch nicht fertig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894718</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sun, 09 May 2010 15:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verstädnisproblem mit Rekursion on Sun, 09 May 2010 15:22:31 GMT]]></title><description><![CDATA[<p>okay. jetzt hab ichs glaub ich wirklich geschnallt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> mit dem entsprechenden verständnis wird die sache wesentlich einfacher.</p>
<p>vielen dank nochmals!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894721</guid><dc:creator><![CDATA[Airlike]]></dc:creator><pubDate>Sun, 09 May 2010 15:22:31 GMT</pubDate></item></channel></rss>