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 sollDanke 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