In Rekursion Wert "mitnemen"?



  • Hi Leute!

    Ich soll eine Funktion schreiben die mir rekursiv einen Wert aus einem Binärbaum löscht (so lautet die korrekte Aufgabenstellung!).

    Ich hab nun diese komplette Funktion in mehrere Teilschritte zerlegt:

    1. Zu löschenden Wert im Baum suchen. Dazu Vorgänger merken.
    2. Element aus dem Baum entnehmen
    3. Suchbaum-Eigenschaft wieder herstellen
    4. Element endgültig löschen

    Ich hab hier nun diese Funktion:

    void searchtree1::DeleteValue(object o)
    {
    	//Wert im Baum suchen
    	if(root->val == o)
    	{
    		//Wert aus dem Baum entnehmen
    	}
    	else if(o < root->val)
    	{
    		root = root->left;
    		object tempVal = root->val;
    
    		DeleteValue(o);
    	}
    	else
    	{
    		root = root->right;
    	}
    }
    

    Ich hab hier nun das Problem, dass ich nicht weiß, wie ich innerhalb der Rekursion den Wert des Vorgänger "mitnehme", damit ich nach dem Löschen, nicht das Probleme bekomme, dass der Zeiger des Vorgänger ins leere zeigt, da ja das nachfolgende Element gelöscht wurde! "tempVal" soll übrigens die Variable sein, die "mitgenommen" werden soll!

    Könnt ihr mir helfen?


  • Mod

    Du gibst der Funktion einen Parameter mit.



  • Ok!

    Muss ich mir als Vorgänger das gesamte Element merken, also Wert, Zeiger nach links und Zeiger nach rechts, oder reicht es, sich nur den Wert als int - in meinem Fall als object - zu übergeben?



  • Probier's doch aus.

    Wenn man alleine ne Lösung findet, ist es i.d.R. viel effektiver, als sich das ganze einfach sagen zu lassen.



  • Alles klar. Bin grad schon dabei 🙂 Wenn was nicht funzen sollte, kann ich ja immer noch fragen...

    Danke!



  • Ich hab jetzt meinen Code abgewandelt und die Suchfunktion in eine extra Funktion geschrieben die ich aus der löschfkt. aus aufrufe.

    void searchtree1::DeleteValue(object o)
    {
    	tree_element1* pred = SearchElement(root, o);	//liefert Zeiger auf den Vorgänger des zu löschenden Elements
    
    }
    
    tree_element1* searchtree1::SearchElement(tree_element1* pred, object o)
    {
    	//Wert im Baum suchen
    	if(root->val == o)
    	{
    		return pred;
    	}
    	else if(o < root->val)
    	{
    		pred = root;
    		root = root->left;
    
    		SearchElement(pred, o);
    	}
    	else
    	{
    		root = root->right;
    	}
    }
    

    Jetzt hab ich aber nun das Problem, dass ich nicht mehr weiß wie ich weitermachen soll. In DeleteValue steht nun in pred der Zeiger auf den Vorgänger des zu löschenden elements. Muss ich jetzt, bevor ich das zu löschende Element lösche, den Zeiger vom Vorgänger auf den nachfolger des zu löschenden elements umbiegen, oder kann ich auch erst löschen und dann umbiegen? Was ist der Fall, wenn das zu löschende Element ein Blatt im Baum ist? Wie muss ich dann die Zeiger des Vorgänger umbiegen?


Anmelden zum Antworten