Knoten löschen



  • Hi Leute!

    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:

    void avltree1::searchVal(avlelem1* &elem, object o)
    {
    	avlelem1* predElem = new avlelem1;
    
    	if(o < elem->val)	//links weitergehen: kleinere Werte
    	{
    		predElem = elem;	//Vorgänger speichern
    
    		elem = elem->left;
    		searchVal(elem, o);
    	}
    	else if(o > elem->val)	//rechts weitergehen: größere Werte
    	{
    		predElem = elem;	//Vorgänger speichern
    
    		elem = elem->right;
    		searchVal(elem, o);
    	}
    	else if(elem->val == o)	//Wenn Wert gefunden...
    	{
    		//... Nachfolger prüfen und entsprechend Pointer umhängen
    		if((elem->left == NULL) && (elem->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->left = NULL;
    			elem->right = NULL;
    		}
    		else if((elem->left != NULL) || (elem->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->left != NULL)
    			{
    
    			}
    			else
    			{
    
    			}
    		}
    		else if((elem->left != NULL) && (elem->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
    		}
    	}
    }
    

    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 😞

    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:

    class avlelem1
    {
    public:
    	int height;
    	avlelem1 *left;
    	object val;
    	avlelem1 *right;
    };
    

Anmelden zum Antworten