Binärer Baum



  • Und zwar ich hab einen Binären Baum programmiert, und stehe nun vor einen schwerwiegenden Problem, dass ich anscheinend zu doof bin um zu beheben

    #include "stdafx.h"
    #include "iostream.h"
    #include "assert.h"
    
    typedef int Schluessel;
    
    class Knoten;
    
    class Baum
    {
        Knoten *wurzel;
    public:
        Baum():wurzel(0){}
        ~Baum();
    
        void einfuegen(Schluessel);
        void loeschen(Schluessel);
    
        bool enthalten(Schluessel) const;
        bool leer() const {return wurzel==0;}
    
        Baum& links() const;
        Baum& rechts() const;
        Baum& teilbaumAb(Schluessel);
        Baum& teilbaumAbmax();
    
        unsigned hoehe() const;
        void ausgeben(ostream&)const;
    private:
        Baum(const Baum&);
        Baum& operator=(const Baum&);
    };
    
    class Knoten
    {
    public:
        Schluessel s;
        Baum links, rechts;
        Knoten(Schluessel x):s(x){}
    };
    
    ostream& operator<<(ostream& o,const Baum& b)
    {
        b.ausgeben(o);
        return o;
    }
    
    Baum::~Baum()
    {
        if(!leer())
            delete wurzel;
    }
    
    inline const Baum& Baum::links() const{return wurzel->links;}
    inline       Baum& Baum::links()      {return wurzel->links;}
    
    inline const Baum& Baum::rechts() const{return wurzel->rechts;}
    inline       Baum& Baum::rechts()      {return wurzel->rechts;}
    
    Baum& Baum::teilbaumAb(Schluessel x)
    {
        if(leer())
            return *this;
        else if(x<wurzel->s)
            return links().teilbaumAb(x);
        else if(x>wurzel->s)
            return rechts().teilbaumAb(x);
        else
            return *this;
    }
    
    Baum& Baum::teilbaumAbmax()
    {
        assert(!leer());
        if(rechts().leer())
            return *this;
        else
            return rechts().teilbaumAbmax();
    }
    
    void Baum::einfuegen(Schluessel x)
    {
        Baum& t=teilbaumAb(x);
        if(t.leer())
            t.wurzel=new Knoten(x);
    }
    
    bool Baum::enthalten(Schluessel x) const
    {
        Baum& b=const_cast<Baum&>(*this);
        return !(b.teilbaumAb(x).leer());
    }
    
    inline unsigned max(unsigned x, unsigned y)
    {
        return x>y?x: y;
    }
    
    unsigned Baum::hoehe() const
    {
        return leer()?0:(1+max(links().hoehe(),rechts().hoehe()));
    }
    
    void Baum::ausgeben(ostream& o) const
    {
        if(wurzel!=0)
        {
            o<<wurzel->links
             <<wurzel->s<<'['<<hoehe()<<"]"
             <<wurzel->rechts;
        }
    }
    
    void Baum::loeschen(Schluessel x)
    {
        Baum& t=teilbaumAb(x);
        if(!t.leer())
        {
            Knoten* zuloeschen;
            if(t.links().leer() && t.rechts().leer())
            {
                zuloeschen=t.wurzel;
                t.wurzel=0;
            }
            else
                if(!t.links().leer()&&!t.rechts().leer())
                {
                    Baum& ersatz=t.links().teilbaumAbmax();
                    t.wurzel->s=ersatz.wurzel->s;
                    zuloeschen=ersatz.wurzel;
                    ersatz.wurzel=ersatz.links().wurzel;
                }
                else
                {
                    zuloeschen=t.wurzel;
                    if(t.links().leer())
                        t.wurzel=t.rechts().wurzel;
                    else
                        t.wurzel=t.links().wurzel;
                }
                zuloeschen->links.wurzel=0;
                zuloeschen->rechts.wurzel=0;
                delete zuloeschen;
        }
    }
    
    int main()
    {
        Baum b;
        Schluessel s;
        while(true)
        {
            cout<<"Einzutragender Wert:";
            cin>>s;
            if(s==0)
                break;
            b.einfuegen(s);
        }
        cout<<"Baum:"<<b<<endl;
        while(true)
        {
            cout<<"Zu suchender Wert:";
            cin>>s;
            if(s==0)
                break;
            if(!b.enthalten(s))
                cout<<"nicht ";
            cout<<"enthalten"<<endl;
        }
        while(true)
        {
            cout<<"Zu loeschender Wert:";
            cin>>s;
            if(s==0)
                break;
            b.loeschen(s);
            cout<<"Baum: 2"<<b<<endl;
        }
        return 0;
    }
    

    und bekomm massige fehlermeldungen schuld daran sind die
    inline const
    doch ich sehe nicht was falsch sein soll

    Danke schon mal im vorraus



  • in const Memberfunktionen dürfen ist der this Zeiger ein const * const, du darfst also nur const Memberfunktionen aufrufen, und keine Membervariablen ändern, außer die sind als mutable deklariert!



  • Nunja, und was soll ich ändern, ich sitze glaub ich schon 4 stunden dabei und rauf mir langsam meine haare aus 😉 /zum glück hab ich lange)

    Mfg Skalariak



  • #include <iostream>
    #include <assert.h>
    using namespace std;
    
    typedef int Schluessel;
    
    class Knoten;
    
    class Baum
    {
        Knoten *wurzel;
    public:
        Baum():wurzel(0){}
        ~Baum();
    
        void einfuegen(Schluessel);
        void loeschen(Schluessel);
    
        bool enthalten(Schluessel) const;
        bool leer() const {return wurzel==0;}
    
        Baum& links() const;
        Baum& rechts() const;
        Baum& teilbaumAb(Schluessel);
        Baum& teilbaumAbmax();
    
        unsigned hoehe() const;
        void ausgeben(ostream&)const;
    private:
        Baum(const Baum&);
        Baum& operator=(const Baum&);
    };
    
    class Knoten
    {
    public:
        Schluessel s;
        Baum links, rechts;
        Knoten(Schluessel x):s(x){}
    };
    
    ostream& operator<<(ostream& o,const Baum& b)
    {
        b.ausgeben(o);
        return o;
    }
    
    Baum::~Baum()
    {
        if(!leer())
            delete wurzel;
    }
    
    //inline const Baum& Baum::links() const{return wurzel->links;}
    inline       Baum& Baum::links() const     {return wurzel->links;}
    
    //inline const Baum& Baum::rechts() const{return wurzel->rechts;}
    inline       Baum& Baum::rechts() const     {return wurzel->rechts;}
    
    Baum& Baum::teilbaumAb(Schluessel x)
    {
        if(leer())
            return *this;
        else if(x<wurzel->s)
            return links().teilbaumAb(x);
        else if(x>wurzel->s)
            return rechts().teilbaumAb(x);
        else
            return *this;
    }
    
    Baum& Baum::teilbaumAbmax()
    {
        assert(!leer());
        if(rechts().leer())
            return *this;
        else
            return rechts().teilbaumAbmax();
    }
    
    void Baum::einfuegen(Schluessel x)
    {
        Baum& t=teilbaumAb(x);
        if(t.leer())
            t.wurzel=new Knoten(x);
    }
    
    bool Baum::enthalten(Schluessel x) const
    {
        Baum& b=const_cast<Baum&>(*this);
        return !(b.teilbaumAb(x).leer());
    }
    
    inline unsigned max(unsigned x, unsigned y)
    {
        return x>y?x: y;
    }
    
    unsigned Baum::hoehe() const
    {
        return leer()?0:(1+max(links().hoehe(),rechts().hoehe()));
    }
    
    void Baum::ausgeben(ostream& o) const
    {
        if(wurzel!=0)
        {
            o<<wurzel->links
             <<wurzel->s<<'['<<hoehe()<<"]"
             <<wurzel->rechts;
        }
    }
    
    void Baum::loeschen(Schluessel x)
    {
        Baum& t=teilbaumAb(x);
        if(!t.leer())
        {
            Knoten* zuloeschen;
            if(t.links().leer() && t.rechts().leer())
            {
                zuloeschen=t.wurzel;
                t.wurzel=0;
            }
            else
                if(!t.links().leer()&&!t.rechts().leer())
                {
                    Baum& ersatz=t.links().teilbaumAbmax();
                    t.wurzel->s=ersatz.wurzel->s;
                    zuloeschen=ersatz.wurzel;
                    ersatz.wurzel=ersatz.links().wurzel;
                }
                else
                {
                    zuloeschen=t.wurzel;
                    if(t.links().leer())
                        t.wurzel=t.rechts().wurzel;
                    else
                        t.wurzel=t.links().wurzel;
                }
                zuloeschen->links.wurzel=0;
                zuloeschen->rechts.wurzel=0;
                delete zuloeschen;
        }
    }
    
    int main()
    {
        Baum b;
        Schluessel s;
        while(true)
        {
            cout<<"Einzutragender Wert:";
            cin>>s;
            if(s==0)
                break;
            b.einfuegen(s);
        }
        cout<<"Baum:"<<b<<endl;
        while(true)
        {
            cout<<"Zu suchender Wert:";
            cin>>s;
            if(s==0)
                break;
            if(!b.enthalten(s))
                cout<<"nicht ";
            cout<<"enthalten"<<endl;
        }
        while(true)
        {
            cout<<"Zu loeschender Wert:";
            cin>>s;
            if(s==0)
                break;
            b.loeschen(s);
            cout<<"Baum: 2"<<b<<endl;
        }
        return 0;
    }
    


  • Ich danke für deine Hilfe nun funktioniert es 😉


Anmelden zum Antworten