<?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[Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden?]]></title><description><![CDATA[<p>Hi</p>
<p>Für mein Studium muss ich einen natürlichen Suchbaum implementieren. Deswegen habe ich zuerst eine Klasse &quot;Node&quot; geschrieben für die Knoten. Diese sieht wie folgt aus:</p>
<pre><code class="language-cpp">class Node
	{
	private:

		int value; // Value of this node

		// Children
		std::auto_ptr&lt;Node&gt; left;
		std::auto_ptr&lt;Node&gt; right;

	public:
		// Constructor
		Node( int a_value) : value(a_value ), left(NULL), right(NULL) {}

		// Getters
		Node &amp; leftNode() const { return *left; }
		Node &amp; rightNode() const { return *right; }

		// Setters
		void setLeftNode( Node &amp; a_left_node ) { left.reset( &amp;a_left_node ); }
		void setRightNOde( Node &amp; a_right_node) { right.reset( &amp;a_right_node ); }
	};
</code></pre>
<p>Ist das Design meiner Klasse so sinnvoll? Ich habe mir überlegt, ob ich vielleicht besser boost::shared_ptr verwenden sollte?</p>
<p>Noch eine andere Frage, bei der ich gerade unsicher bin:<br />
Ich habe jeweils etwas Mühe zu entscheiden, ob ich new nehmen soll oder nicht für die Erzeugung der Objekte. Wenn ich sehr viele Knoten erzeugen muss, dann wäre es meines Wissens nach sinvoll, diese mit new zu erzeugen, damit nicht alle diese Objekte auf den Stack kommen. Ist das richtig? Wenn ich was mit new mache, dann nehme ich dann natürlich smart pointers und nicht rohe Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284044/ist-das-design-der-klasse-sinnvoll-oder-soll-ich-besser-einen-boost-shared_ptr-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 05:45:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284044.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Mar 2011 14:23:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 14:23:04 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Für mein Studium muss ich einen natürlichen Suchbaum implementieren. Deswegen habe ich zuerst eine Klasse &quot;Node&quot; geschrieben für die Knoten. Diese sieht wie folgt aus:</p>
<pre><code class="language-cpp">class Node
	{
	private:

		int value; // Value of this node

		// Children
		std::auto_ptr&lt;Node&gt; left;
		std::auto_ptr&lt;Node&gt; right;

	public:
		// Constructor
		Node( int a_value) : value(a_value ), left(NULL), right(NULL) {}

		// Getters
		Node &amp; leftNode() const { return *left; }
		Node &amp; rightNode() const { return *right; }

		// Setters
		void setLeftNode( Node &amp; a_left_node ) { left.reset( &amp;a_left_node ); }
		void setRightNOde( Node &amp; a_right_node) { right.reset( &amp;a_right_node ); }
	};
</code></pre>
<p>Ist das Design meiner Klasse so sinnvoll? Ich habe mir überlegt, ob ich vielleicht besser boost::shared_ptr verwenden sollte?</p>
<p>Noch eine andere Frage, bei der ich gerade unsicher bin:<br />
Ich habe jeweils etwas Mühe zu entscheiden, ob ich new nehmen soll oder nicht für die Erzeugung der Objekte. Wenn ich sehr viele Knoten erzeugen muss, dann wäre es meines Wissens nach sinvoll, diese mit new zu erzeugen, damit nicht alle diese Objekte auf den Stack kommen. Ist das richtig? Wenn ich was mit new mache, dann nehme ich dann natürlich smart pointers und nicht rohe Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039443</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 24 Mar 2011 14:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 14:33:33 GMT]]></title><description><![CDATA[<p><code>auto_ptr</code> bedeutet Besitz. Die Klasse node besitzt in Deinem Fall aber nicht die Children-Nodes ( <code>left</code> , <code>right</code> ), sondern besitzt nur einen Zeiger auf diese.</p>
<p>Wenn node gelöscht wird, werden auch die nodes <code>left</code> und <code>right</code> gelöscht und das geht dann so weiter...</p>
<p>Daher ist <code>auto_ptr</code> nicht geeignet.</p>
<p>shared_ptr würde gehen, aber ich glaube ein reiner Zeiger wäre hier besser, da shared_ptr wiederrum &quot;geteilter Besitz&quot; bedeutet. Aber node besitzt <code>left</code> und <code>right</code> nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039449</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 24 Mar 2011 14:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 15:14:10 GMT]]></title><description><![CDATA[<p>Stimmt, ein einfacher Pointer wäre wohl das beste. Die Klasse Node besitzt die anderen Knoten ja gar nicht, habe ich ganz vergessen ^^</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039472</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 24 Mar 2011 15:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 15:38:46 GMT]]></title><description><![CDATA[<p>Ich würde hier gar nicht so weit gehen und den Baum auf einen std::vector abbilden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039480</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 24 Mar 2011 15:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 16:20:01 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich würde hier gar nicht so weit gehen und den Baum auf einen std::vector abbilden.</p>
</blockquote>
<p>Ich weiss jetzt nicht genau was für eine Abbildung du wählen würdest und wie std::vector implementiert ist.<br />
Aber ich könnte mir vorstellen, dass meine Implementierung bei häufigem Einfügen und Entfernen effizienter ist.</p>
<p>*Edit<br />
Was ich vielleicht noch hätte sagen sollen: Auf dem Suchbaum sind die Operationen search, insert und remove erklärt. Der Baum muss nicht irgendwelche speziellen Kriterien wie z.B. maximale Höhendifferenz oder so erfüllen. Er kann also theoretisch zu einer linearen Liste degenerieren. Deshalb sehe ich keine effiziente Implementierung (auch was den Speicher angeht) mit einem std::vector. Das heisst natürlich nicht, dass es keine gibt ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039496</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 24 Mar 2011 16:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 16:41:32 GMT]]></title><description><![CDATA[<p>search gibt dann nur einen bool zurück? oder eine const&amp; auf die Nutzdaten?</p>
<p>Ich denke eher an</p>
<pre><code class="language-cpp">class Tree{
	struct Node
	{
		int value; // Value of this node
		Node* left;
		Node* Node right;

		Node( int a_value) 
                : value(a_value )
                , left(NULL)
                , right(NULL) {
                }
        };
        Node* root;
        public:
        Tree()
        : root(NULL) {
        }
        void insert(int value) {
           //ab hier schwierig
};
</code></pre>
<p>Wenn ich mich recht erinnere, kannst Du als Zwei-Sterne-Programmierer die anfallenden 12 Fallunterscheidungen vom remove auf 4 runterdrücken. Indem Du Knoten und Kanten denkst, <code>typedef Node* Kante;</code> und eine Suchfunktion anbietest, an welcher Kante der Wert hängen müßte, also wo man den Knoten dran finden müßte, wenn man danach sucht, und wo man den Knoten dranhängen müßte, wenn man ihn einfügen wöllte und wo man den ganzen Unterbaum dranhängen müßte, den man leider abhängen mußte, als bei remove ein Knoten verschwand, der zwei Kinder(-Bäume) hatte.</p>
<pre><code class="language-cpp">private:
      Node** searchItsParentsChildpointer(int value) {
           Node** p=&amp;root;
           while(*p!=0) {
               if(value==(*p)-&gt;value)
                  return p;
               else
                  if(value&gt;(*p)-&gt;value)
                     p=&amp;(*p)-&gt;right);
                  else
                     p=&amp;(*p)-&gt;right);
           }
           return p;
      }
</code></pre>
<p>und die dann in search, in insert und in remove verwenden.<br />
(Ist aber 13 Jahre her, daß ich das machte und obiger Code ist nur zur Anschauung hingehudelt, könnte auch gerade mal total fwehlerhaft sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039514</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 24 Mar 2011 16:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 16:51:43 GMT]]></title><description><![CDATA[<p><a href="http://magazin.c-plusplus.net/artikel/Binary%20Heaps" rel="nofollow">http://magazin.c-plusplus.net/artikel/Binary%20Heaps</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039519</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 24 Mar 2011 16:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 16:56:56 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p><a href="http://magazin.c-plusplus.net/artikel/Binary%20Heaps" rel="nofollow">http://magazin.c-plusplus.net/artikel/Binary%20Heaps</a></p>
</blockquote>
<p>Paßt hier nicht. Den Heap kann man nur deswegen linksaufgefüllt machen und in ein Array packen, weil die Heap-Bedingung<br />
Papa ist kleiner als die beiden Kinder<br />
schwächer ist als die Binärsuchbaumbedingung<br />
Papa liegt zwischen den Kindern.<br />
Im Heap kann man ein kleines rechtes Kind einfach zu einem kleinen linken Kind machen, wenn da Platz ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039523</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 24 Mar 2011 16:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 17:34:31 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p><a href="http://magazin.c-plusplus.net/artikel/Binary%20Heaps" rel="nofollow">http://magazin.c-plusplus.net/artikel/Binary%20Heaps</a></p>
</blockquote>
<p>Ich möchte keinen binären Heap. Das ist nicht das gleiche wie ein Suchbaum. Aber trotzem danke.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a><br />
Meine Klasse Tree sieht in etwa gleich aus. Von der Theorie her weiss ich wie der Suchbaum funktioniert, das müsste dann gehen.<br />
Könntest du mir kurz das ** erklären? Ich verstehe nicht ganz was z.B.</p>
<pre><code class="language-cpp">Node** p=&amp;root;
</code></pre>
<p>macht. Ich hab noch nie ** verwendet ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039550</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 24 Mar 2011 17:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 18:07:33 GMT]]></title><description><![CDATA[<p>Zeiger auf ein Zeiger. Ermöglicht es zum Beispiel, den Zeiger selbst und nicht nur das Objekt zu ändern. Sinnloses Beispiel:</p>
<pre><code class="language-cpp">void SetToNull(int** ptr)
{
    *ptr = NULL;
}

int main()
{
    int* ptr;
    SetToNull(&amp;ptr);
}
</code></pre>
<p>Aber das braucht man sehr selten. Das gleiche könnte man mit Referenzen erreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039572</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 24 Mar 2011 18:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 19:36:45 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>shared_ptr würde gehen, aber ich glaube ein reiner Zeiger wäre hier besser, da shared_ptr wiederrum &quot;geteilter Besitz&quot; bedeutet. Aber node besitzt <code>left</code> und <code>right</code> nicht.</p>
</blockquote>
<p>Nein, Parent besitzt nicht Child? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Das ist mir neu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039596</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 24 Mar 2011 19:36:45 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 22:55:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Danke für die Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039674</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 24 Mar 2011 22:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Thu, 24 Mar 2011 23:36:35 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Könntest du mir kurz das ** erklären? Ich verstehe nicht ganz was z.B.</p>
<pre><code class="language-cpp">Node** p=&amp;root;
</code></pre>
<p>macht. Ich hab noch nie ** verwendet ^^</p>
</blockquote>
<p>Das ist auch recht verrückt. Schön, daß Du mit Nexus es klären konntest.<br />
Dein Prof erwartet sicher nicht ** zu sehen, sondern die normale Version, die im Vergleich dazu beim remove halt ein wenig in die Breite geht, na bei den anderen auch. Meine **-Version ist nicht produktiver Code, sondern ein Gedicht<sup>(1)</sup>. Damals hat Prof Weber in Darmstadt die Aufgabe gestellt und ich war in einer sehr explorativen Phase.<br />
Falls Du auch im 2. Semester bist, sollst Du sowas noch gar nicht hinkriegen. Ich dachte nur, vielleicht hast Du ja auch Spaß daran. Denn das Ergebnis ist einfach hübsch, kann man nicht anders sagen.</p>
<p><sup>(1)</sup><br />
Eher ein Wortspiel, wie &quot;Der Torwart, dieser Volksheld, hält, trotz Regen auf das Spielfeld fällt.&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039685</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 24 Mar 2011 23:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Sat, 26 Mar 2011 12:52:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a><br />
Ich werde mir das mit den ** dann später mal anschauen, sieht interessant aus.</p>
<p>Im Moment möchte ich zuerst allerdings den SearchTree zum laufen bringen. Ich habe schon länger nicht mehr mit Pointern hantiert in C++ und habe entsprechend ein bisschen Probleme mit dem ganzen.</p>
<p>Ich habe bis jetzt folgenden Code:</p>
<pre><code class="language-cpp">class SearchTree
	{
	private:
		struct Node
		{
			int value;
			Node *left;
			Node *right;

			Node( int a_value ) : value(a_value), left(NULL), right(NULL) {}
		};

		Node* root;

	public:
		SearchTree() : root(NULL) {}

		void insert( int a_value )
		{
			Node* current_node = root; // current_node is a node where a_value might me inserted
			bool inserted = false;

			while ( !inserted )
			{
				if ( current_node == NULL ) // Insertion location found
				{
					current_node = new Node( a_value );
					inserted = true;
				}
				else if ( a_value &lt; current_node-&gt;value ) // Go left
					current_node = current_node-&gt;left;
				else if ( a_value &gt; current_node-&gt;value ) // Go right
					current_node = current_node-&gt;right;
				else // Value already in tree
				{
					std::cout &lt;&lt; &quot;Value already in tree&quot; &lt;&lt; std::endl;
					inserted = true;
				}
			}
		}
	};
</code></pre>
<p>Wenn ich jetzt z.B. diesen Code hier schreibe</p>
<pre><code class="language-cpp">int main()
{
	SearchTree tree;

	tree.insert( 10 );
	tree.insert( 8 );
	tree.insert( 12 );
}
</code></pre>
<p>dann habe ich das Problem, dass trotzdem noch alle Nodes NULL sind. Ich glaube das Problem liegt bei</p>
<pre><code class="language-cpp">Node* current_node = root; // current_node is a node
</code></pre>
<p>Wenn ich current_node verändere, ändert sich root nicht. Liegt das daran, dass beim Kopieren der Adresse root NULL ist? Wenn ja, wie kann ich das Problem am besten umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040383</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 26 Mar 2011 12:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Sat, 26 Mar 2011 14:36:06 GMT]]></title><description><![CDATA[<p>So, es scheint nun soweit zu funktionieren mit dem Einfügen. Für diejenigen, die es interessiert wie ich es gelöst habe:</p>
<pre><code class="language-cpp">class SearchTree
	{
	private:
		struct Node
		{
			int value;
			Node *left;
			Node *right;

			Node( int a_value ) : value(a_value), left(NULL), right(NULL) {}
		};
	public:
		Node* root;

	public:
		SearchTree() : root(NULL) {}

		void insert( int a_value )
		{
			bool inserted = false;

			if ( root == NULL ) // If there is no root yet, directly insers the new Node there
			{
				root = new Node( a_value );
				inserted = true;
			}

			Node* current_node = root; // Start at the root

			while ( !inserted )
			{
				if ( a_value &lt; current_node-&gt;value ) // Go to left
				{
					if ( current_node-&gt;left == NULL ) // Left child is NULL
					{
						current_node-&gt;left = new Node( a_value );
						inserted = true;
					}
					else // Else continue with left child
					{
						current_node = current_node-&gt;left;
						continue;
					}
				}

				else if ( a_value &gt; current_node-&gt;value ) // Go to right
				{
					if ( current_node-&gt;right == NULL ) // Right child is NULL
					{
						current_node-&gt;right = new Node( a_value );
						inserted = true;
					}
					else // Else continue with right child
					{
						current_node = current_node-&gt;right;
						continue;
					}
				}
				else // Value already in tree
				{
					std::cout &lt;&lt; &quot;Value already in tree&quot; &lt;&lt; std::endl;
					break;
				}
			}
		}

	};
</code></pre>
<p>PS:<br />
Ich habe mir noch nicht genau überlegt, ob sich der Code noch vereinfachen oder optimieren lässt. Könnte also durchaus bessere Lösungen geben <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040422</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 26 Mar 2011 14:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Sun, 27 Mar 2011 08:52:20 GMT]]></title><description><![CDATA[<p>schreit das nicht eigentlich nach einer rekursiven Lösung statt dem <code>while()</code> drumrum?</p>
<pre><code class="language-cpp">void insert( int a_value )
        {
                if ( a_value &lt; current_node-&gt;value ) // Go to left
                {
                    if ( current_node-&gt;left == NULL ) // Left child is NULL
                    {
                        current_node-&gt;left = new Node( a_value );
                        return;
                    }
                    else // Else continue with left child
                    {
                        current_node-&gt;left.insert(a_value);
                    }
                }

                else if ( a_value &gt; current_node-&gt;value ) // Go to right
                {
                    if ( current_node-&gt;right == NULL ) // Right child is NULL
                    {
                        current_node-&gt;right = new Node( a_value );
                        return;
                    }
                    else // Else continue with right child
                    {
                        current_node-&gt;right.insert(a_value);
                    }
                }
                else // Value already in tree
                {
                    std::cout &lt;&lt; &quot;Value already in tree&quot; &lt;&lt; std::endl;
                    break;
                }
            }
        }
</code></pre>
<p>Abgesehen davon .... warum merkst du dir in jedem Node den root? Eigentlich wird es doch eher so gemacht das du in deiner Applikation einen root-node (member) hältst, willst du was wissen benutzt du das als Einstiegspunkt in den Baum. Dafür brauchst du natürlich auch noch neben insert() sowas wie find().<br />
Was dir definitiv fehlt ist jemand, der die ganzen new's wieder löscht - da du das anlegen jetzt ja in deiner Struct erledigst solltest du das Löschen auch dort erledigen --&gt; Destructor der seine childs löscht. Deinem Insert fehlt auch noch sowas wie eine Balacierung oder Korrekturmethodik damit du vernünftig suchen kannst. Sonst kannst du bei ungeeigneten Eingaben sehr tiefe unbalancierte sowie suchtechnisch völlig Unsinnige Bäume erzeugen:</p>
<p>inserte mal 10 9 8 7 6 5 4 3 2 1 und guck was passiert. Oder als root: 0, dann 4 und -4 und dann 2.</p>
<p>Suchbäume sind mE ein eher nichttriviales Problem - zumindest wenn du da was selbst entwickeln willst. Irgendwie was zu speichern und irgendwie wiederzufinden (zur Not alles durchsuchen) ist einfach, das ganze geschickt zu lösen braucht meist etwas mehr Aufwand - als Einstieg zB<br />
<a href="http://de.wikipedia.org/wiki/Bin%C3%A4rer_Suchbaum" rel="nofollow">http://de.wikipedia.org/wiki/Binärer_Suchbaum</a><br />
<a href="http://de.wikipedia.org/wiki/Balancierter_Baum" rel="nofollow">http://de.wikipedia.org/wiki/Balancierter_Baum</a><br />
<a href="http://de.wikipedia.org/wiki/Rot-Schwarz-Baum" rel="nofollow">http://de.wikipedia.org/wiki/Rot-Schwarz-Baum</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040692</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Sun, 27 Mar 2011 08:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Sun, 27 Mar 2011 11:11:52 GMT]]></title><description><![CDATA[<p>padreigh schrieb:</p>
<blockquote>
<p>schreit das nicht eigentlich nach einer rekursiven Lösung statt dem <code>while()</code> drumrum?</p>
</blockquote>
<p>Nein. Die rekursive Lösung ist nur langsamer und unzuverlässiger.</p>
<p>padreigh schrieb:</p>
<blockquote>
<p>Deinem Insert fehlt auch noch sowas wie eine Balacierung oder Korrekturmethodik damit du vernünftig suchen kannst. Sonst kannst du bei ungeeigneten Eingaben sehr tiefe unbalancierte sowie suchtechnisch völlig Unsinnige Bäume erzeugen</p>
</blockquote>
<p>Das weiß er.<br />
Es ist ein sehr guter Einstieg, zuerst einen Suchbauum zu machen, der kein balancing hat. Und erst, wenn man mit dem zufrieden ist, sich an anderere wagt.<br />
Und das macht er gerade. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040754</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 27 Mar 2011 11:11:52 GMT</pubDate></item><item><title><![CDATA[Reply to Ist das Design der Klasse sinnvoll? Oder soll ich besser einen boost::shared_ptr verwenden? on Sun, 27 Mar 2011 11:47:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23744">@padreigh</a><br />
Ich schliesse mich dem was volkard gesagt hat an.</p>
<p>Ich weiss, dass ich den Speicher noch nicht frei gebe, das kommt noch. Es gibt dafür dann auch ein remove. Ich muss dann noch genau schauen wie ich das mit dem delete mache.</p>
<p>Der Suchbaum ist natürlich auch noch nicht fertig und ich bin mir ziemlich sicher, dass er noch nicht korrekt funktioniert. Ich arbeite noch dran <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2040775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2040775</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 27 Mar 2011 11:47:40 GMT</pubDate></item></channel></rss>