<?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äre Suchbäume remove-funktion]]></title><description><![CDATA[<p>hi<br />
hab folgendes problem bei den binären suchbäumen in der remove funktion :</p>
<p>und zwar nach dem ich die 4 entfernt habe wird das Element nicht komplett gelöscht nur die 4 und diese wird auch nur durch irgend einen wert ersetzt wenn ich also die 3 suche bleibt er in einer dauerschleife stecken in der er das element sucht<br />
so weit ich ich weiß muss ich den pointer auf das element löschen, aber die frage ist wie</p>
<pre><code>/* 

#ifndef LIST_H
#define	LIST_H

#include &lt;cstdlib&gt;
#include &lt;string&gt;
using namespace std;

class List {
public:
    virtual void add(int value) = 0;
    virtual bool remove(int value) = 0;
    virtual int size() = 0;
    virtual bool find(int value) = 0;

};

#endif	/* LIST_H */
</code></pre>
<pre><code>/* 

#ifndef BINARYSEARCHTREE_H
#define	BINARYSEARCHTREE_H
#include&quot;List.h&quot;
#include&lt;iostream&gt;

class BinarySearchTree : public List {
public:

    void add(int value);
    bool remove(int value);
    bool find(int value);
    int size();
    BinarySearchTree();
    virtual ~BinarySearchTree();

protected:

    class Element {
    public:
        Element(int value);
        Element(int value, Element* left, Element* right);

        int value_;
        Element* left_;
        Element* right_;

    };

    bool findElement(int value, Element* element);
    void addElement(int value, Element* &amp;element );
    bool removeElement(int value, Element* element);

    Element* root_;
    int size_;

};

#endif	/* BINARYSEARCHTREE_H */
</code></pre>
<pre><code>#include &quot;BinarySearchTree.h&quot;
using namespace std;

BinarySearchTree::Element::Element(int value) 
{
    value_ = value;
    left_ = NULL;
    right_ = NULL;
}

BinarySearchTree::Element::Element(int value, Element* left, Element* right)
{
    value_ = value;
    left_ = left;
    right_ = right;
}

void BinarySearchTree::add(int value)
{
    addElement(value, root_);
    size_++;
}

void BinarySearchTree::addElement(int value, Element* &amp;element)//stimmt
{

    if (element == NULL) //noch kein element
    {
        element = new Element(value); 
    } 
    else if (value &lt; element-&gt;value_)// das vorherige Element ist größer
    {
        addElement(value, element-&gt;left_);
    } 
    else  // das vorherige Element ist kleiner
    {
        addElement(value, element-&gt;right_);
    }
}
bool BinarySearchTree::removeElement(int value, Element* element)
{

    if(element == NULL)//element nicht vorhanden
    {
        return false;

    }
    else if(value &lt; element-&gt;value_)//sucht in den elementen die kleiner sind 
    {
        removeElement(value, element-&gt;left_);
    }
    else  // sucht in den elementen die größer sind
    {
        removeElement(value, element-&gt;right_);
    }
    if(value == element-&gt;value_)//hat das richtige element gefunden
    {

        if(!element-&gt;left_ &amp;&amp; !element-&gt;right_)// ein Blatt(keine werte unter sich)

        { 

            delete element;
            size_ --;
        }
        else if(element-&gt;right_=NULL)//ein Kind (ein wert unter sich auf der linken Seite)

        {

           element-&gt;value_ = element-&gt;left_-&gt;value_;
           delete element;
           size_ --;
        }
        else if(element-&gt;left_=NULL) //ein Kind (ein wert unter sich auf der rechten Seite)

        {

            element-&gt;value_ = element-&gt;right_-&gt;value_;
            delete element;
            size_ --;
        }
        else   // zwei Kinder ( mehrere werte unter sich)
        {
            element =element-&gt;right_;
            while(element-&gt;left_!=NULL)
            {
                element = element-&gt;left_;
            }
            element-&gt;value_=element-&gt;right_-&gt;value_;
            delete(element-&gt;right_);

        }
    }
}
bool BinarySearchTree::remove(int value) 
{
    removeElement(value, root_);

}

bool BinarySearchTree::find(int value) 
{
    return findElement(value, root_);
}

bool BinarySearchTree::findElement(int value, Element* element)//stimmt
{
    if (element == NULL) //element nicht gefunden
    {
        return false;
    } 
    else if (value == element-&gt;value_)  //element gefunden
        {
            return true;
        } 
    else if (value &lt; element-&gt;value_) //element ist größer als gesucht wert-&gt; auf linken seite suchen
         {
                return findElement(value, element-&gt;left_);
         } 
    else // element ist kleiner als gesuchter wert-&gt; auf rechten seite suchen
         {
        return findElement(value, element-&gt;right_);
        }
}

int BinarySearchTree::size() 
{
    return size_;
}
BinarySearchTree::BinarySearchTree()
{
    root_ = NULL;
    size_ = 0;
}

BinarySearchTree::~BinarySearchTree()
{

}
</code></pre>
<pre><code>#include &lt;cstdlib&gt;
#include&quot;List.h&quot;
#include &quot;BinarySearchTree.h&quot;

using namespace std;

int main()
{

  BinarySearchTree myList;

    myList.add(5);
    myList.add(3);
    myList.add(4);
    myList.add(2);
    myList.add(7);

    cout&lt;&lt;&quot;Das ergebnis für 8 ist: &quot;&lt;&lt;myList.find(8)&lt;&lt;endl;
    cout&lt;&lt;&quot;Das ergebnis für 2 ist: &quot;&lt;&lt;myList.find(2)&lt;&lt;endl;
    cout&lt;&lt;&quot;das ergebnis für 4 ist: &quot;&lt;&lt;myList.find(4)&lt;&lt;endl;
    cout&lt;&lt;&quot;Die Listengroeße ist: &quot;&lt;&lt;myList.size()&lt;&lt;endl;

    myList.remove(4);
    myList.remove(3);
    myList.remove(5);
    myList.remove(8);

    cout&lt;&lt;&quot;das ergebnis für 4 ist: &quot;&lt;&lt;myList.find(4)&lt;&lt;endl;
    cout&lt;&lt;&quot;Die Listengroeße ist: &quot;&lt;&lt;myList.size()&lt;&lt;endl;

    //myList.remove(42);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/310510/binäre-suchbäume-remove-funktion</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 05:35:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310510.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Nov 2012 13:26:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binäre Suchbäume remove-funktion on Tue, 13 Nov 2012 13:26:36 GMT]]></title><description><![CDATA[<p>hi<br />
hab folgendes problem bei den binären suchbäumen in der remove funktion :</p>
<p>und zwar nach dem ich die 4 entfernt habe wird das Element nicht komplett gelöscht nur die 4 und diese wird auch nur durch irgend einen wert ersetzt wenn ich also die 3 suche bleibt er in einer dauerschleife stecken in der er das element sucht<br />
so weit ich ich weiß muss ich den pointer auf das element löschen, aber die frage ist wie</p>
<pre><code>/* 

#ifndef LIST_H
#define	LIST_H

#include &lt;cstdlib&gt;
#include &lt;string&gt;
using namespace std;

class List {
public:
    virtual void add(int value) = 0;
    virtual bool remove(int value) = 0;
    virtual int size() = 0;
    virtual bool find(int value) = 0;

};

#endif	/* LIST_H */
</code></pre>
<pre><code>/* 

#ifndef BINARYSEARCHTREE_H
#define	BINARYSEARCHTREE_H
#include&quot;List.h&quot;
#include&lt;iostream&gt;

class BinarySearchTree : public List {
public:

    void add(int value);
    bool remove(int value);
    bool find(int value);
    int size();
    BinarySearchTree();
    virtual ~BinarySearchTree();

protected:

    class Element {
    public:
        Element(int value);
        Element(int value, Element* left, Element* right);

        int value_;
        Element* left_;
        Element* right_;

    };

    bool findElement(int value, Element* element);
    void addElement(int value, Element* &amp;element );
    bool removeElement(int value, Element* element);

    Element* root_;
    int size_;

};

#endif	/* BINARYSEARCHTREE_H */
</code></pre>
<pre><code>#include &quot;BinarySearchTree.h&quot;
using namespace std;

BinarySearchTree::Element::Element(int value) 
{
    value_ = value;
    left_ = NULL;
    right_ = NULL;
}

BinarySearchTree::Element::Element(int value, Element* left, Element* right)
{
    value_ = value;
    left_ = left;
    right_ = right;
}

void BinarySearchTree::add(int value)
{
    addElement(value, root_);
    size_++;
}

void BinarySearchTree::addElement(int value, Element* &amp;element)//stimmt
{

    if (element == NULL) //noch kein element
    {
        element = new Element(value); 
    } 
    else if (value &lt; element-&gt;value_)// das vorherige Element ist größer
    {
        addElement(value, element-&gt;left_);
    } 
    else  // das vorherige Element ist kleiner
    {
        addElement(value, element-&gt;right_);
    }
}
bool BinarySearchTree::removeElement(int value, Element* element)
{

    if(element == NULL)//element nicht vorhanden
    {
        return false;

    }
    else if(value &lt; element-&gt;value_)//sucht in den elementen die kleiner sind 
    {
        removeElement(value, element-&gt;left_);
    }
    else  // sucht in den elementen die größer sind
    {
        removeElement(value, element-&gt;right_);
    }
    if(value == element-&gt;value_)//hat das richtige element gefunden
    {

        if(!element-&gt;left_ &amp;&amp; !element-&gt;right_)// ein Blatt(keine werte unter sich)

        { 

            delete element;
            size_ --;
        }
        else if(element-&gt;right_=NULL)//ein Kind (ein wert unter sich auf der linken Seite)

        {

           element-&gt;value_ = element-&gt;left_-&gt;value_;
           delete element;
           size_ --;
        }
        else if(element-&gt;left_=NULL) //ein Kind (ein wert unter sich auf der rechten Seite)

        {

            element-&gt;value_ = element-&gt;right_-&gt;value_;
            delete element;
            size_ --;
        }
        else   // zwei Kinder ( mehrere werte unter sich)
        {
            element =element-&gt;right_;
            while(element-&gt;left_!=NULL)
            {
                element = element-&gt;left_;
            }
            element-&gt;value_=element-&gt;right_-&gt;value_;
            delete(element-&gt;right_);

        }
    }
}
bool BinarySearchTree::remove(int value) 
{
    removeElement(value, root_);

}

bool BinarySearchTree::find(int value) 
{
    return findElement(value, root_);
}

bool BinarySearchTree::findElement(int value, Element* element)//stimmt
{
    if (element == NULL) //element nicht gefunden
    {
        return false;
    } 
    else if (value == element-&gt;value_)  //element gefunden
        {
            return true;
        } 
    else if (value &lt; element-&gt;value_) //element ist größer als gesucht wert-&gt; auf linken seite suchen
         {
                return findElement(value, element-&gt;left_);
         } 
    else // element ist kleiner als gesuchter wert-&gt; auf rechten seite suchen
         {
        return findElement(value, element-&gt;right_);
        }
}

int BinarySearchTree::size() 
{
    return size_;
}
BinarySearchTree::BinarySearchTree()
{
    root_ = NULL;
    size_ = 0;
}

BinarySearchTree::~BinarySearchTree()
{

}
</code></pre>
<pre><code>#include &lt;cstdlib&gt;
#include&quot;List.h&quot;
#include &quot;BinarySearchTree.h&quot;

using namespace std;

int main()
{

  BinarySearchTree myList;

    myList.add(5);
    myList.add(3);
    myList.add(4);
    myList.add(2);
    myList.add(7);

    cout&lt;&lt;&quot;Das ergebnis für 8 ist: &quot;&lt;&lt;myList.find(8)&lt;&lt;endl;
    cout&lt;&lt;&quot;Das ergebnis für 2 ist: &quot;&lt;&lt;myList.find(2)&lt;&lt;endl;
    cout&lt;&lt;&quot;das ergebnis für 4 ist: &quot;&lt;&lt;myList.find(4)&lt;&lt;endl;
    cout&lt;&lt;&quot;Die Listengroeße ist: &quot;&lt;&lt;myList.size()&lt;&lt;endl;

    myList.remove(4);
    myList.remove(3);
    myList.remove(5);
    myList.remove(8);

    cout&lt;&lt;&quot;das ergebnis für 4 ist: &quot;&lt;&lt;myList.find(4)&lt;&lt;endl;
    cout&lt;&lt;&quot;Die Listengroeße ist: &quot;&lt;&lt;myList.size()&lt;&lt;endl;

    //myList.remove(42);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2270468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270468</guid><dc:creator><![CDATA[wennoder]]></dc:creator><pubDate>Tue, 13 Nov 2012 13:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Binäre Suchbäume remove-funktion on Tue, 13 Nov 2012 13:54:26 GMT]]></title><description><![CDATA[<p>Wenn Du einen Blatt löschst, dann muss Du auch den Parent updaten, damit der nicht ins Nirvana zeigt.<br />
Abgesehen davon meine ich, dass Du auch gerne den Child und den Parent in deinem Code durcheinander wirfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270473</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Tue, 13 Nov 2012 13:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to Binäre Suchbäume remove-funktion on Tue, 13 Nov 2012 13:54:18 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if (element-&gt;right_=NULL)  // Zuweisung, kein Vergleich
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2270479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270479</guid><dc:creator><![CDATA[= != ==]]></dc:creator><pubDate>Tue, 13 Nov 2012 13:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Binäre Suchbäume remove-funktion on Fri, 16 Nov 2012 15:45:21 GMT]]></title><description><![CDATA[<p>okj hab das ganze jetzt noch mal überarbeitet aber es ist immer noch die frage wie ich den pointer auf das element lösche</p>
<pre><code>bool BinarySearchTree::removeElement(int value, Element* element)
{

    if(element == NULL)//element nicht vorhanden
    {
        return false;

    }
    else if(value &lt; element-&gt;value_)//sucht in den elementen die kleiner sind 
    {
        removeElement(value, element-&gt;left_);
    }
    else  // sucht in den elementen die größer sind
    {
        removeElement(value, element-&gt;right_);
    }
    if(value == element-&gt;value_)//hat das richtige element gefunden
    {

        if(!element-&gt;left_ &amp;&amp; !element-&gt;right_)// ein Blatt(keine werte unter sich)
//        if(element-&gt;left_=NULL &amp;&amp; element-&gt;right_=NULL)
        { 

            delete element;
            size_ --;
        }
        else if(element-&gt;left_ &amp;&amp; !element-&gt;right_)//ein Kind (ein wert unter sich auf der linken Seite)
        //else if(element-&gt;right_=NULL)
        {

           element-&gt;value_ = element-&gt;left_-&gt;value_;
           delete element;
           size_ --;
        }
        else if(!element-&gt;left_ &amp;&amp; element-&gt;right_)//ein Kind (ein wert unter sich auf der rechten Seite)
        //else if(element-&gt;left_=NULL)
        {

            element-&gt;value_ = element-&gt;right_-&gt;value_;
            delete element;
            size_ --;
        }
        else   // zwei Kinder ( mehrere werte unter sich)
        {
            element =element-&gt;right_;
            while(element-&gt;left_!=NULL)
            {
                element = element-&gt;left_;
            }
            element-&gt;value_=element-&gt;right_-&gt;value_;
            delete(element-&gt;right_);
            //delete(temp-&gt;value_);
            //if(element-&gt;left_-&gt;value_&lt; element-&gt;left_-&gt;left_-&gt;value_)

        }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2271498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2271498</guid><dc:creator><![CDATA[wennoder]]></dc:creator><pubDate>Fri, 16 Nov 2012 15:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to Binäre Suchbäume remove-funktion on Thu, 22 Nov 2012 14:39:55 GMT]]></title><description><![CDATA[<p>okj habs jetzt noch mal überarbeitet und mit hilfe von wikipedia soweit fertig aus denn fall wenn ein element zwei kinder hat<br />
<a href="http://en.wikipedia.org/wiki/Binary_search_tree" rel="nofollow">http://en.wikipedia.org/wiki/Binary_search_tree</a></p>
<pre><code>bool BinarySearchTree::removeElement(int value,Element* &amp;element)
{

    if(element == NULL)//element nicht vorhanden
    {
        return false;

    }
    else if(value &lt; element-&gt;value_)//sucht in den elementen die kleiner sind 
    {
        removeElement(value, element-&gt;left_);
    }
    else  // sucht in den elementen die größer sind
    {
        removeElement(value, element-&gt;right_);
    }
    if(value == element-&gt;value_)//hat das richtige element gefunden
    {
       Element* temp; 

         if(element-&gt;right_==NULL)//ein Kind (ein wert unter sich auf der linken Seite)
        {
           temp=element-&gt;left_;
           delete element;
           element=temp;
           size_ --;
        }
         else if(element-&gt;left_==NULL)//ein Kind (ein wert unter sich auf der rechten Seite)
        {
            temp=element-&gt;right_;
            delete element;
            element=temp;
            size_ --;
        }
        else   // zwei Kinder ( mehrere werte unter sich)
        {
             temp = element-&gt;right_;

                        while(temp-&gt;left_!=NULL)
                        {
                                temp = temp-&gt;left_;
                        }
                        element-&gt;value_ = temp-&gt;value_;
                        delete(element-&gt;right_,temp-&gt;value_); //das delete temp-&gt;value geht nicht BinarySearchTree.cpp:93:60: error: type ‘int’ argument given to ‘delete’, expected pointer                      
                        size_--;

        }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2273436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273436</guid><dc:creator><![CDATA[wennoder]]></dc:creator><pubDate>Thu, 22 Nov 2012 14:39:55 GMT</pubDate></item></channel></rss>