<?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[Knoten löschen]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich hab hier eine Aufgabe die mir gerade Kopf zerbrechen bereitet. Ich soll aus einem AVL-Baum Werte löschen. Ich hab dazu folgenden Code:</p>
<pre><code>void avltree1::searchVal(avlelem1* &amp;elem, object o)
{
	avlelem1* predElem = new avlelem1;

	if(o &lt; elem-&gt;val)	//links weitergehen: kleinere Werte
	{
		predElem = elem;	//Vorgänger speichern

		elem = elem-&gt;left;
		searchVal(elem, o);
	}
	else if(o &gt; elem-&gt;val)	//rechts weitergehen: größere Werte
	{
		predElem = elem;	//Vorgänger speichern

		elem = elem-&gt;right;
		searchVal(elem, o);
	}
	else if(elem-&gt;val == o)	//Wenn Wert gefunden...
	{
		//... Nachfolger prüfen und entsprechend Pointer umhängen
		if((elem-&gt;left == NULL) &amp;&amp; (elem-&gt;right == NULL))	//Wenn zu löschender Knoten keine Nachfolger hat, ...
		{
			//... dann Knoten einfach aushängen
			elem = predElem;	//Knoten auf Vorgänger setzen???

			//Knoten aushängen
			elem-&gt;left = NULL;
			elem-&gt;right = NULL;
		}
		else if((elem-&gt;left != NULL) || (elem-&gt;right != NULL))	//Wenn zu löschender Knoten einen linken oder rechten Nachfolger hat, ...
		{
			//... dann linken/rechten Nachfolger des zu löschenden Knoten an den Vorgänger des zu löschenden Knoten anhängen
			if(elem-&gt;left != NULL)
			{

			}
			else
			{

			}
		}
		else if((elem-&gt;left != NULL) &amp;&amp; (elem-&gt;right != NULL))	//Wenn zu löschender Knoten einen linken und rechten Nachfolger hat, ...
		{
			//... dann zu löschenden Knoten durch den linkesten Knoten in seinem rechten Teilbaum ersetzen
		}
	}
}
</code></pre>
<p>In Zeile 3 lege ich mir ein neues Element meiner Klasse avlelem1 an, dass später den Voränger beinhalten soll, aber genau das wird dann in Zeile 25 zum Problem: Es ist kein Vorgänger des zu löschenden Knotens gespeichert, den ich aber brauche um die Zeiger aushängen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Wie muss ich dann an diese Aufgabe rangehen? Kann mir da jemand Tips geben? Braucht ihr noch mehr Code? Die Klasse avlelem1 sieht so aus:</p>
<pre><code>class avlelem1
{
public:
	int height;
	avlelem1 *left;
	object val;
	avlelem1 *right;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/316515/knoten-löschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 20:57:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316515.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 May 2013 18:21:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Knoten löschen on Mon, 06 May 2013 18:21:20 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich hab hier eine Aufgabe die mir gerade Kopf zerbrechen bereitet. Ich soll aus einem AVL-Baum Werte löschen. Ich hab dazu folgenden Code:</p>
<pre><code>void avltree1::searchVal(avlelem1* &amp;elem, object o)
{
	avlelem1* predElem = new avlelem1;

	if(o &lt; elem-&gt;val)	//links weitergehen: kleinere Werte
	{
		predElem = elem;	//Vorgänger speichern

		elem = elem-&gt;left;
		searchVal(elem, o);
	}
	else if(o &gt; elem-&gt;val)	//rechts weitergehen: größere Werte
	{
		predElem = elem;	//Vorgänger speichern

		elem = elem-&gt;right;
		searchVal(elem, o);
	}
	else if(elem-&gt;val == o)	//Wenn Wert gefunden...
	{
		//... Nachfolger prüfen und entsprechend Pointer umhängen
		if((elem-&gt;left == NULL) &amp;&amp; (elem-&gt;right == NULL))	//Wenn zu löschender Knoten keine Nachfolger hat, ...
		{
			//... dann Knoten einfach aushängen
			elem = predElem;	//Knoten auf Vorgänger setzen???

			//Knoten aushängen
			elem-&gt;left = NULL;
			elem-&gt;right = NULL;
		}
		else if((elem-&gt;left != NULL) || (elem-&gt;right != NULL))	//Wenn zu löschender Knoten einen linken oder rechten Nachfolger hat, ...
		{
			//... dann linken/rechten Nachfolger des zu löschenden Knoten an den Vorgänger des zu löschenden Knoten anhängen
			if(elem-&gt;left != NULL)
			{

			}
			else
			{

			}
		}
		else if((elem-&gt;left != NULL) &amp;&amp; (elem-&gt;right != NULL))	//Wenn zu löschender Knoten einen linken und rechten Nachfolger hat, ...
		{
			//... dann zu löschenden Knoten durch den linkesten Knoten in seinem rechten Teilbaum ersetzen
		}
	}
}
</code></pre>
<p>In Zeile 3 lege ich mir ein neues Element meiner Klasse avlelem1 an, dass später den Voränger beinhalten soll, aber genau das wird dann in Zeile 25 zum Problem: Es ist kein Vorgänger des zu löschenden Knotens gespeichert, den ich aber brauche um die Zeiger aushängen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Wie muss ich dann an diese Aufgabe rangehen? Kann mir da jemand Tips geben? Braucht ihr noch mehr Code? Die Klasse avlelem1 sieht so aus:</p>
<pre><code>class avlelem1
{
public:
	int height;
	avlelem1 *left;
	object val;
	avlelem1 *right;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2321466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2321466</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 06 May 2013 18:21:20 GMT</pubDate></item></channel></rss>