<?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[Tripletree (einlesen&#x2F;ausgeben inorder)]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe probiert einen Tripletree zu programmieren.<br />
Der soll kleinere Zeichen im linken, gleiche im mittleren und größere im rechten Ast speichern.</p>
<p>Die Funktion insert(char) soll ein Zeichen einfügen und traverse() soll den Baum inorder Ausgeben.</p>
<p>insert funzt eigentlich soweit ganz gut, nur die Wurzel hab ich bisher noch unschön im Konstruktor integriert...naja, mit traverse hapert es noch..könnt ihr mir da Tips geben ?</p>
<p>Die Ausgabe müßte (laut den Chars unten im Code) ja wie folgt aussehen:<br />
AABCDDGGHN.</p>
<p>Dank für Hinweise!!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class tree
{
	public:

	struct knoten
	{
		public:

		char inhalt;
		knoten* kleiner;
		knoten* gleich;
		knoten* groesser;
	};

	knoten* start; // Wurzel
	knoten* aktuell; // &quot;Cursor&quot; für den aktuellen Knoten
	knoten** helf; // &quot;merkt&quot; sich den letzen Knoten

	tree(); // Konstruktor

	void insert(char zeichen) // Anfang insert
	{

		if(aktuell == NULL)
		{
			cout &lt;&lt; &quot;Eingefuegt: &quot; &lt;&lt; zeichen &lt;&lt; &quot;\n&quot;; // nur zur Überprüfung
			aktuell = new knoten;
			aktuell-&gt;inhalt = zeichen;
			aktuell-&gt;kleiner = NULL;
			aktuell-&gt;gleich = NULL;
			aktuell-&gt;groesser= NULL;

			*helf = aktuell;

			aktuell = start; // setzt &quot;aktuell&quot; nach dem Einfügen wieder auf die Wurzel
		}

		else
		{

			if(zeichen &lt; aktuell-&gt;inhalt)
			{ 
				helf = &amp;(aktuell-&gt;kleiner);
				aktuell = aktuell-&gt;kleiner;
				cout &lt;&lt; &quot;Zeichen ist kleiner &quot;;
				insert(zeichen);
			}

			else
			{
				if(zeichen &gt; aktuell-&gt;inhalt)
				{
					helf = &amp;(aktuell-&gt;groesser);
					aktuell = aktuell-&gt;groesser;
					cout &lt;&lt; &quot;Zeichen ist groesser &quot;;
					insert(zeichen);
				}
			}

			if(zeichen == aktuell-&gt;inhalt)
			{
				helf = &amp;(aktuell-&gt;gleich);
				aktuell = aktuell-&gt;gleich;
				cout &lt;&lt; &quot;Zeichen ist gleich &quot;;
				insert(zeichen);
			}
		}

	} // Ende insert

	void traverse() // Anfang traverse
	{ 

		if(aktuell-&gt;kleiner != NULL)
		{
			aktuell = aktuell-&gt;kleiner;
			traverse();
		}

		if(aktuell-&gt;gleich != NULL)
		{
			aktuell = aktuell-&gt;gleich;
			traverse();
		}

		cout &lt;&lt; &quot;  &quot; &lt;&lt; aktuell-&gt;inhalt;

		if(aktuell-&gt;groesser != NULL)
		{
			aktuell = aktuell-&gt;groesser;
			traverse();
		}

	} // Ende traverse()

	~tree(); // Destruktor
};

tree::tree() // Konstruktor mit Wurzel
{
	start = new knoten;
	start-&gt;kleiner = NULL;
	start-&gt;gleich = NULL;
	start-&gt;groesser = NULL;
	start-&gt;inhalt = 'D';
	aktuell = start;
}

tree::~tree()
{}

int main()
{
	tree *baum = new tree();

	baum-&gt;insert('A');
	baum-&gt;insert('G');
	baum-&gt;insert('H');
	baum-&gt;insert('B');
	baum-&gt;insert('N');
	baum-&gt;insert('C');
	baum-&gt;insert('D');
	baum-&gt;insert('A');
	baum-&gt;insert('G');

	baum-&gt;traverse();

        return 0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/207036/tripletree-einlesen-ausgeben-inorder</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 21:07:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207036.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Mar 2008 03:06:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 03:06:54 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich habe probiert einen Tripletree zu programmieren.<br />
Der soll kleinere Zeichen im linken, gleiche im mittleren und größere im rechten Ast speichern.</p>
<p>Die Funktion insert(char) soll ein Zeichen einfügen und traverse() soll den Baum inorder Ausgeben.</p>
<p>insert funzt eigentlich soweit ganz gut, nur die Wurzel hab ich bisher noch unschön im Konstruktor integriert...naja, mit traverse hapert es noch..könnt ihr mir da Tips geben ?</p>
<p>Die Ausgabe müßte (laut den Chars unten im Code) ja wie folgt aussehen:<br />
AABCDDGGHN.</p>
<p>Dank für Hinweise!!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class tree
{
	public:

	struct knoten
	{
		public:

		char inhalt;
		knoten* kleiner;
		knoten* gleich;
		knoten* groesser;
	};

	knoten* start; // Wurzel
	knoten* aktuell; // &quot;Cursor&quot; für den aktuellen Knoten
	knoten** helf; // &quot;merkt&quot; sich den letzen Knoten

	tree(); // Konstruktor

	void insert(char zeichen) // Anfang insert
	{

		if(aktuell == NULL)
		{
			cout &lt;&lt; &quot;Eingefuegt: &quot; &lt;&lt; zeichen &lt;&lt; &quot;\n&quot;; // nur zur Überprüfung
			aktuell = new knoten;
			aktuell-&gt;inhalt = zeichen;
			aktuell-&gt;kleiner = NULL;
			aktuell-&gt;gleich = NULL;
			aktuell-&gt;groesser= NULL;

			*helf = aktuell;

			aktuell = start; // setzt &quot;aktuell&quot; nach dem Einfügen wieder auf die Wurzel
		}

		else
		{

			if(zeichen &lt; aktuell-&gt;inhalt)
			{ 
				helf = &amp;(aktuell-&gt;kleiner);
				aktuell = aktuell-&gt;kleiner;
				cout &lt;&lt; &quot;Zeichen ist kleiner &quot;;
				insert(zeichen);
			}

			else
			{
				if(zeichen &gt; aktuell-&gt;inhalt)
				{
					helf = &amp;(aktuell-&gt;groesser);
					aktuell = aktuell-&gt;groesser;
					cout &lt;&lt; &quot;Zeichen ist groesser &quot;;
					insert(zeichen);
				}
			}

			if(zeichen == aktuell-&gt;inhalt)
			{
				helf = &amp;(aktuell-&gt;gleich);
				aktuell = aktuell-&gt;gleich;
				cout &lt;&lt; &quot;Zeichen ist gleich &quot;;
				insert(zeichen);
			}
		}

	} // Ende insert

	void traverse() // Anfang traverse
	{ 

		if(aktuell-&gt;kleiner != NULL)
		{
			aktuell = aktuell-&gt;kleiner;
			traverse();
		}

		if(aktuell-&gt;gleich != NULL)
		{
			aktuell = aktuell-&gt;gleich;
			traverse();
		}

		cout &lt;&lt; &quot;  &quot; &lt;&lt; aktuell-&gt;inhalt;

		if(aktuell-&gt;groesser != NULL)
		{
			aktuell = aktuell-&gt;groesser;
			traverse();
		}

	} // Ende traverse()

	~tree(); // Destruktor
};

tree::tree() // Konstruktor mit Wurzel
{
	start = new knoten;
	start-&gt;kleiner = NULL;
	start-&gt;gleich = NULL;
	start-&gt;groesser = NULL;
	start-&gt;inhalt = 'D';
	aktuell = start;
}

tree::~tree()
{}

int main()
{
	tree *baum = new tree();

	baum-&gt;insert('A');
	baum-&gt;insert('G');
	baum-&gt;insert('H');
	baum-&gt;insert('B');
	baum-&gt;insert('N');
	baum-&gt;insert('C');
	baum-&gt;insert('D');
	baum-&gt;insert('A');
	baum-&gt;insert('G');

	baum-&gt;traverse();

        return 0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1467071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467071</guid><dc:creator><![CDATA[xMänneken]]></dc:creator><pubDate>Mon, 03 Mar 2008 03:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 08:38:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void traverse() // Anfang traverse
    {

        if(kleiner != NULL)
        {
            kleiner-&gt;traverse();
        }

        if(gleich != NULL)
        {
            gleich-&gt;traverse();
        }

        cout &lt;&lt; &quot;  &quot; &lt;&lt; inhalt;

        if(groesser != NULL)
        {
            groesser-&gt;traverse();
        }

    } // Ende traverse()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1467103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467103</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 03 Mar 2008 08:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 08:45:33 GMT]]></title><description><![CDATA[<p>So wäre aber besser:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class Node{
private:
    T value;

    Node *smaller;
    Node *equal;
    Node *larger;

public:
    Node(const T &amp;a) : value(a), smaller(0), equal(0), larger(0){

    }    
    virtual ~Node(){ 
	if (smaller) delete smaller;
	if (equal) delete equal;
	if (larger) delete larger;
    }

    void insert(const T &amp;a){
	if (a &lt; value){
	    if (!smaller) smaller = new Node(a);
	    else smaller-&gt;insert(a);
	}
	else if (a == value){
	    if (!equal) equal = new Node(a);
	    else equal-&gt;insert(a);
	}
	else{
	    if (!larger) larger = new Node(a);
	    else larger-&gt;insert(a);
	}
    }
    void print(){
	if (smaller) smaller-&gt;print();
	if (equal) equal-&gt;print();
	std::cout &lt;&lt; &quot; &quot; &lt;&lt; value;
	if (larger) larger-&gt;print();
    }    
};

template&lt;typename T&gt;
class Tree{
private:    
    Node&lt;T&gt; *root;

public:
    Tree() : root(0){}
    virtual ~Tree(){ if (root) delete root; }

    void insert(const T &amp;a){
	if (root) root-&gt;insert(a);
	else root = new Node&lt;T&gt;(a);
    }
    void print(){
	if (root){
	    root-&gt;print();
	    std::cout &lt;&lt; std::endl;
	}
	else std::cout &lt;&lt; &quot;&lt;empty&gt;&quot; &lt;&lt; std::endl;
    }
};

int main(int argc, char *argv[]){
    Tree&lt;char&gt; tree;

    tree.insert('a');
    tree.insert('n');
    tree.insert('r');
    tree.insert('f');
    tree.insert('k');
    tree.insert('l');

    tree.print();
}
</code></pre>
<p>1. Mit Templates kannst du das Ding auch mit allen anderen Datentypen benutzen<br />
2. Mit Destruktor hast du keine Speicherlecks.<br />
3. Durch Splittung in Node und Tree kannst du auch einen leeren Baum haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467116</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 03 Mar 2008 08:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 11:31:54 GMT]]></title><description><![CDATA[<p>Was soll denn das if(smaller) usw. vor dem delete im Node-Destruktor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467195</guid><dc:creator><![CDATA[Tyrdal]]></dc:creator><pubDate>Mon, 03 Mar 2008 11:31:54 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 11:51:51 GMT]]></title><description><![CDATA[<p>Tyrdal schrieb:</p>
<blockquote>
<p>Was soll denn das if(smaller) usw. vor dem delete im Node-Destruktor?</p>
</blockquote>
<p>Das überprüft ob der Pointer nicht Null ist. Ansonsten fliegt dir das um die Ohren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467204</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 03 Mar 2008 11:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 11:57:31 GMT]]></title><description><![CDATA[<p>bei delete 0 fliegt nix herum</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467209</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Mon, 03 Mar 2008 11:57:31 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 12:06:31 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Tyrdal schrieb:</p>
<blockquote>
<p>Was soll denn das if(smaller) usw. vor dem delete im Node-Destruktor?</p>
</blockquote>
<p>Das überprüft ob der Pointer nicht Null ist. Ansonsten fliegt dir das um die Ohren.</p>
</blockquote>
<p>Ein delete auf einen NULL-Zeiger ist nach dem Standard definiert (=es passiert nichts).</p>
<p>Das einzige was dir um die Ohren fliegen kann sind uninitialisierte Zeiger die auf eine zufällige Adresse (!=0) verweisen. Und dagegen kann dein if auch nicht schützen.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467215</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 03 Mar 2008 12:06:31 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 12:11:20 GMT]]></title><description><![CDATA[<p>Tatsächlich? Ist mir neu. Gut zu wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467218</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 03 Mar 2008 12:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to Tripletree (einlesen&#x2F;ausgeben inorder) on Mon, 03 Mar 2008 13:18:07 GMT]]></title><description><![CDATA[<p>Was willst Du eigentlich mit dieser Baumstruktur anstellen? Nicht dass das std::priority_queue das für Dich erledigen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467282</guid><dc:creator><![CDATA[witte_]]></dc:creator><pubDate>Mon, 03 Mar 2008 13:18:07 GMT</pubDate></item></channel></rss>