:Knoten in Binärbaum löschen



  • Hallo,
    habe ein kleines Programm für Binärbaumerstellung, das einfache Löschen funktioniert noch nicht. Habe das Problem eines Ausnahmefehlers bei der Verbindung Eltern-Enkel-Knoten.
    Hoffe, jemand könnte mir helfen und im Voraus schon vielen Dank.

    struct satz{
    	char name[15];
            int position;
    };
    struct knoten{
    	satz markierung;knoten *links;
    	knoten *rechts;knoten *oben;		
    };
    extern knoten *wurzel = new knoten;
    extern int indexpos = 1;
    
    int eingabe(knoten* k);
    int einfuegen(knoten*& baum, knoten* neu);
    int loescheKnoten(knoten* k);
    int loesche1(knoten* k);
    
    int initKnoten(knoten* k, char m[15]){
    	strcpy(k->markierung.name,m);
            k->markierung.position=indexpos;
    	k->links=NULL;k->rechts=NULL;
            k-oben=NULL;
    	return 0;}
    
    int main(){
    
    	char wahl;
    knoten* wurzel = new knoten;
    	initKnoten(wurzel,"");
    	strcpy(wurzel->markierung.name,"Wurzel_leer");
    	do{
    		cout << endl;
    		cout << " Eingabe ...        e" << endl;
    		cout << " Loeschen ...	    l" << endl;
    		cout << " Ende ...           q" << endl;
    		cout << " Waehlen Sie! ";
    			cin >> wahl;
    
    		switch(wahl){
    		case 'e' : eingabe(wurzel);break;
    		case 'l' : loescheKnoten(wurzel);break;
    		default : cout << "Programmende.";
    		}
    	}
    	while(wahl !='q');
    	return 0;
    }
    int eingabe(knoten* k){
    	char key[15];
            cout << endl << "Namen eingeben ... "; 
            cout.flush(); gets(key);
    	if(strcmp(k->markierung.name,"Wurzel_leer") == 0) initKnoten(k,key);
    	else{
    		knoten *neu = new knoten;
    		initKnoten(neu,key);
    		einfuegen(k,neu);
    	}
    	indexpos++;
    	return 0;
    }
    int einfuegen(knoten*& baum, knoten* neu){
        if(baum==NULL){ baum = neu;}
        else{
            if(strcmp(neu->markierung.name,baum->markierung.name)<0){
    			einfuegen(baum->links,neu);}
    	else { einfuegen(baum->rechts,neu);}
        }
        return 0;
    }
    int loescheKnoten(knoten* k){
            loesche1(k);	//loeschen eines Knotens mit einem Nachfolger
    	return 0;
    }
    int loesche1(knoten* k){
            char key[15];
            cout << endl << "Namen eingeben ... ";
    	cout.flush();gets(key);
    	knoten* enkel = new knoten;		
    	initKnoten(enkel,key);			
    	if(k->links == NULL) enkel = k->links;	
    	else enkel = k->rechts;
    
    	//if(k->oben==NULL)	//Pruefen, ob k evtl Wurzel
    	//enkel = k;return;
    
    //ab hier klar, dass Elternknoten von k ist vorhanden 
    	knoten* eltern = k->oben;	
    //Verbinde Elternknoten zum Enkel
    if(eltern->links == k)  //!!! Ausnahmefehler !!!
    		eltern->links=enkel;
    	else eltern->rechts=enkel;
    //Verbinde Enkel zum elternknoten
    		if(enkel!=NULL) enkel->oben = eltern;
    	return 0;
    }
    

Anmelden zum Antworten