<?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[Binärbaum]]></title><description><![CDATA[<p>void BinaryTree::display(Data* node)<br />
{//rekursive Loesung</p>
<p>if ( node==NULL )</p>
<p>return;</p>
<p>else<br />
{<br />
node-&gt;display();<br />
display(node-&gt;getLeft());<br />
display(node-&gt;getRight());<br />
}<br />
}</p>
<p>Wie ihr seht sollen alle Knoten eines Binärbaums ausgegeben werden. Es wird zuerst der linke Zweig ausgegeben. Dabei wird mittels Rekursion immer wieder der linke Knoten aufgerufen bis dieser Null ist . Dann wird abgebrochen.<br />
Ich versteh grad nicht wann der rechte Zweig also display(node-&gt;getRight());<br />
aufgerufen wird. Ich kapier wohl die Rekursion grade nicht.</p>
<p>Helft mir mal . Danke !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242201/binärbaum</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 02:52:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242201.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 May 2009 23:41:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärbaum on Sun, 31 May 2009 23:41:20 GMT]]></title><description><![CDATA[<p>void BinaryTree::display(Data* node)<br />
{//rekursive Loesung</p>
<p>if ( node==NULL )</p>
<p>return;</p>
<p>else<br />
{<br />
node-&gt;display();<br />
display(node-&gt;getLeft());<br />
display(node-&gt;getRight());<br />
}<br />
}</p>
<p>Wie ihr seht sollen alle Knoten eines Binärbaums ausgegeben werden. Es wird zuerst der linke Zweig ausgegeben. Dabei wird mittels Rekursion immer wieder der linke Knoten aufgerufen bis dieser Null ist . Dann wird abgebrochen.<br />
Ich versteh grad nicht wann der rechte Zweig also display(node-&gt;getRight());<br />
aufgerufen wird. Ich kapier wohl die Rekursion grade nicht.</p>
<p>Helft mir mal . Danke !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718874</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Sun, 31 May 2009 23:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 06:57:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>1. Code Tags wären super:</p>
<pre><code class="language-cpp">void BinaryTree::display(Data* node)
{//rekursive Loesung

   if ( node==NULL ) return;

   else
   {
      node-&gt;display();
      display(node-&gt;getLeft());
      display(node-&gt;getRight());
   }
}
</code></pre>
<p>2. So wie du deine display Methode defniert hast, dürfte die obige Lösung sich nichtmal kompilieren lassen.</p>
<p>3. Der richtige Weg wäre bei JEDEM Methodenaufruf die Display Methode des linken UND des rechten Nodes aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718910</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Mon, 01 Jun 2009 06:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 17:35:26 GMT]]></title><description><![CDATA[<p>Kann mir bitte mal jemand diesen Code erklären. Ich komm mit der Rekursion einfach nicht klar. Wann wird der rechte Zweig durchlaufen ?</p>
<pre><code>struct node
          {
               int data;
               node *left;
               node *right;
          };

void inorder(node *tree)
          {
               if(tree!=NULL)
               {
                    inorder(tree-&gt;left);
                    cout&lt;&lt;tree-&gt;data;
                    inorder(tree-&gt;right);
                    getch();
               }
          }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1719214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719214</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 01 Jun 2009 17:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 18:03:16 GMT]]></title><description><![CDATA[<p>Ok, Code Tags. Nächste mal dann bitte C/C++ Code Tags.</p>
<p>Ich gehe mal davon aus das es um diese drei Zeilen geht, der Rest dürfte klar sein oder?</p>
<pre><code class="language-cpp">inorder(tree-&gt;left);
cout&lt;&lt;tree-&gt;data;
inorder(tree-&gt;right);
</code></pre>
<p>Der Durchlauf des rechten Zweigs wird begonnen sobald es auf auf der linken Seite keine Elemente mehr gibt. Also im Normalfall am unteren Ende des Baumes.<br />
Mal dir doch mal auf einen Zellulosedatenträger einen Binary Tree auf und versuch das nachzuverfolgen. Leg dir einfach im Programm einen Tree mit ein paar Verzweigungen an und probier ein bisschen herum.</p>
<p>#edit: Zugegebenermaßen, diese Rekursion ist nicht unbedingt die einfachste. Bist du dir sicher das du eine &quot;normale&quot; Rekursion verstanden hast? Also z.B. sowas:</p>
<pre><code class="language-cpp">class Node
{
    public:
    Node *next;
    int data;
};

Node *node;

void displayList()
{
    std::cout &lt;&lt; node-&gt;data &lt;&lt; std::endl;
    if(node-&gt;next != NULL)
    {
        displayList();
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1719228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719228</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Mon, 01 Jun 2009 18:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 18:16:32 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">inorder(tree-&gt;left); 
cout&lt;&lt;tree-&gt;data;             //Warum hier Ausgabe der Daten,
inorder(tree-&gt;right);
                             // aber beim Durchlauf des rechten Zweigs nicht ???
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1719237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719237</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 01 Jun 2009 18:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 19:41:21 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">inorder(tree-&gt;left); 
cout&lt;&lt;tree-&gt;data;             //Warum hier Ausgabe der Daten,
inorder(tree-&gt;right);
                             // aber beim Durchlauf des rechten Zweigs nicht ???
</code></pre>
</blockquote>
<p>Der Punkt ist, du rufst für den rechten Zweig ebenfalls inorder() auf.</p>
<pre><code class="language-cpp">inorder(tree-&gt;right);
</code></pre>
<p>Entsprechend werden auch für diesen die Daten ausgegeben.</p>
<p>Jeder Knoten hat ja wiederum zwei Verzweigungen, eine links und eine rechts.</p>
<pre><code>Node
          |
   --------------
   |            |
 Links        Rechts
</code></pre>
<p>Zuerst wird praktisch der letzte Knoten der am weitesten Links ist ausgegeben, danach kommt der rechte &quot;daneben&quot;. Der Baum wird praktisch von unten nach oben ausgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719286</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Mon, 01 Jun 2009 19:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Mon, 01 Jun 2009 22:15:54 GMT]]></title><description><![CDATA[<p>Danke für dein Bemühen .</p>
<p>Wieso steht denn der tree-&gt;left Zeiger gleich ganz unten ?<br />
wenn ich den root node übergebe würde er doch ganz oben stehn.</p>
<p>Steig noch nicht ganz dahinter.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719349</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 01 Jun 2009 22:15:54 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 05:46:52 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">inorder(tree-&gt;left);
cout&lt;&lt;tree-&gt;data;
inorder(tree-&gt;right);
</code></pre>
<p>cout wird ja zum ersten mal erst dann aufgerufen wenn du ganz am Ende bist. Mal angenommen wir sind am dem Punkt wo das if(tree != NULL) zuschlägt.</p>
<pre><code class="language-cpp">void inorder(node *tree)
          {
               if(tree!=NULL)
               {
                    inorder(tree-&gt;left);
                    cout&lt;&lt;tree-&gt;data; // &lt;= hier
                    inorder(tree-&gt;right);
                    getch();
               }
          }
</code></pre>
<p>Dann bist du ja praktisch &quot;ganz links unten&quot; im Baum und die Funktion kommt zum ersten mal zurück, also bist du dort wo ich es Code markiert habe. Dann werden die Daten also zum ersten mal ausgegeben und er prüft ob auf der rechten Seite evtl. noch etwas ist. Wenn nein kommt auch diese Funktion zurück und du kommst an den zweiten Node von links unten gesehen und hast wieder genau die gleiche Prozedur: er gibt die Daten des Nodes aus und prüft dann ob nicht rechts noch etwas da ist. Sinnvoller wäre die Funktion wohl so:</p>
<pre><code class="language-cpp">void inorder(node *tree)
          {
               if(tree!=NULL)
               {
                    cout&lt;&lt;tree-&gt;data;
                    inorder(tree-&gt;left);
                    inorder(tree-&gt;right);
                    getch();
               }
          }
</code></pre>
<p>Dann würde der Baum von oben nach unten ausgegeben (zugegebenermaßen, erst die linke Seite :S).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719370</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Tue, 02 Jun 2009 05:46:52 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 08:29:39 GMT]]></title><description><![CDATA[<p>Ok danke das hab ich jetzt verstanden. Er gibt tatsächlich den knoten ganz links zuerst aus. Dann dann rechten Teil des Knoten. Was ich noch nicht versteh warum er dann überhaupt weiter macht. Ist der rechte Knoten NULL dann bricht er doch komplett ab. Es kommt im Code doch nichts mehr.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719445</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 08:29:39 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 08:34:42 GMT]]></title><description><![CDATA[<p>Ergänzung:</p>
<p>Die if Sequenz prüft ob tree!= NULL;</p>
<p>ist der rechte Knoten NULL dann geht er doch gar nicht mehr in den Block rein.<br />
Das ist mein Problem.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719449</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 08:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 08:46:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23381">@blurry333</a>,<br />
Die Funktion ruft sich intern immer wieder selbst auf, was ja auch der Sinn der Rekursion ist. Wenn du nun ganz links unten angekommen bist, hast du x Funktionen aufgerufen. Wenn nun <code>tree == NULL</code> ist, dann wird die x'te Funktion verlassen und die (x-1)'te Funktion geht weiter und ruft nun <code>inorder(tree-&gt;right)</code> auf. usw. usf.</p>
<p>Am besten schnappst du dir mal ein Bleistift und ein Block und skizzierst dir den Callstack nach, dann sollte es dir klar werden. Oder dann fehlt dir irgendwelches Grundwissen über Funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719462</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 08:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 09:32:43 GMT]]></title><description><![CDATA[<p>hmm. Aber die Abruchbedingung ist doch tree!=NULL.<br />
Kommt er jetzt im rechten Knoten auf einen Zeiger der auf Null zeigt also noch<br />
keine Kinder hat. Dann bricht er doch ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719479</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 09:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 09:46:07 GMT]]></title><description><![CDATA[<p>um mein Problem mal deutlich zu machen , habe ich eine kurze Rekursion<br />
geschrieben.</p>
<pre><code class="language-cpp">void rekur(int x)
{

if(x&gt;0)              //Hier bricht doch auch die Rekursion ab, wieso aber nicht 
{                    // bei tree!= NULL
cout&lt;&lt;x&lt;&lt;&quot; &quot;; x--;
rekur(x);
}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1719489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719489</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 09:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 11:41:58 GMT]]></title><description><![CDATA[<p>Die Rekursion bricht dort ab, wo sich die Funktion innerhalb der Funktion nicht mehr selbst aufruft. Und bei Dir ist das der Fall, wenn tree == NULL ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719549</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Tue, 02 Jun 2009 11:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 11:59:55 GMT]]></title><description><![CDATA[<p>Ganz korrekt ist die Rekursion erst fertig, wenn der erste Funktionsaufruf vollständig durchgelaufen ist. Ist das wirklich so schwer zu verstehen?</p>
<p>Ich skizziere mal das Nodebeispiel:</p>
<pre><code>call inorder(&quot;value&quot;)                           ---&gt; erster Aufruf

if &quot;value&quot; valid? -&gt; yes
call inorder(&quot;left of value&quot;)                   ---&gt; zweiter Aufruf
  if &quot;left of value&quot; valid? -&gt; yes
  call inorder(&quot;left of left of value&quot;)         ---&gt; dritter Aufruf
    if &quot;left of left of value&quot; valid? -&gt; no
    return                                      ---&gt; dritter Aufruf beendet
                                                     zurück zum Zweiten
  call inorder(&quot;right of left of value&quot;)        ---&gt; vierter Aufruf
    if &quot;right of left o value&quot; valid? -&gt; no
    return                                      ---&gt; vierter Aufruf beendet
                                                     zurück zum Zweiten
  return                                        ---&gt; zweiter Aufruf beendet
                                                     zurück zum Ersten
call inorder(&quot;right of value&quot;)                  ---&gt; fünfter Aufruf
  if &quot;right of value&quot; valid? -&gt; yes
  call inorder(&quot;left of right of value&quot;)        ---&gt; sechster Aufruf
    if &quot;left of right of value&quot; valid? -&gt; no
    return                                      ---&gt; sechster Aufruf beendet
                                                     zurück zum Fünften
  call inorder(&quot;right of right of value&quot;)       ---&gt; siebter Aufruf
    if &quot;right of right of value&quot; valid? -&gt; no
    return                                      ---&gt; siebter Aufruf beendet
                                                     zurück zum Fünften
  return                                        ---&gt; fünfter Aufruf beendet
                                                     zurück zum Ersten
return                                          ---&gt; erster Aufruf beendet

- Rekursions Ende -
</code></pre>
<p>Also damit sollte es nun echt klar werden. Ansonsten muss ich wohl aufgeben ...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719560</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 11:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 12:20:54 GMT]]></title><description><![CDATA[<p>Danke für deinen Erklärungsversuch.<br />
Mein Problem ist weiterhin dass ich in meinem Code keine return Anweisung habe.<br />
Wie komme ich also zu dem parent Knoten zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719570</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 12:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 12:26:20 GMT]]></title><description><![CDATA[<p>Die Funktion kehrt zurück, sobald sie komplett durchlaufen ist. Wie jede andere Funktion auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719574</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Tue, 02 Jun 2009 12:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 12:35:26 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>Wie komme ich also zu dem parent Knoten zurück.</p>
</blockquote>
<pre><code class="language-cpp">void foo()
{
}

// Ist das gleiche wie:

void foo()
{
  return;
}
</code></pre>
<p>Wenn die Funktion am Ende ankommt oder zu einem return gelangt, wird sie beendet und kehrt in die Aufruferfunktion zurück. Die Aufruferfunktion macht dann dort weiter, wo sie die Funktion aufgerufen hat.</p>
<p>Also kurz an zwei unterschiedlichen Funktionen erläutert:</p>
<pre><code class="language-cpp">void bar()
{
  // bar wird ausgeführt.
}

void foo()
{
  // Der Prozess/Thread kommt in dies Funktion foo.

  bar(); // bar wird aufgerufen.
  // bar wurde ausgeführt.

  bar(); // bar wird aufgerufen.
  // bar wurde ausgeführt.
}
</code></pre>
<p>Lass es dir an einer einfachen Rekursion von einem Programm zeigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int recTest(int x)
{
  std::cout &lt;&lt; &quot;Funktion Nr. &quot; &lt;&lt; x &lt;&lt; &quot; startet.&quot; &lt;&lt; std::endl;

  if(x &lt; 5)
  {
    recTest(x + 1);

    std::cout &lt;&lt; &quot;Zurueck in Funktion Nr. &quot; &lt;&lt; x &lt;&lt; std::endl;
  }
  else
  {
    std::cout &lt;&lt; &quot;x &gt;= 5&quot; &lt;&lt; std::endl;
  }

  std::cout &lt;&lt; &quot;Funktion Nr. &quot; &lt;&lt; x &lt;&lt; &quot; endet.&quot; &lt;&lt; std::endl;
}

int main()
{
  recTest(0);

  return 0;
}
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719584</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 12:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Binärbaum on Tue, 02 Jun 2009 13:30:18 GMT]]></title><description><![CDATA[<p>Herzlichen Dank .<br />
Dein letztes Code Beispiel hat mir die Augen geöffnet.<br />
Ich hatte die Funktionsweise des Stack außer Acht gelassen.</p>
<p>Vielen herzlichen Dank !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719643</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Tue, 02 Jun 2009 13:30:18 GMT</pubDate></item></channel></rss>