Warum doppelter Pointer beim Löschen aus Binärbaum?



  • Hallo,

    lese zur Zeit gerade folgendes Buch:

    http://www.pronix.de/pronix-834.html

    Nun frage ich mich wieso man bei den Löschfunktionen (die stehen weiter unten) einen doppel Pointer braucht. Wenn ich das Ganze mit einen normalen Pointer mache gibts einen Zugriffsfehler. Wäre nice, wenn mir das jemand erklären könnte.

    MfG,
    Todd



  • Hallo,

    das läuft deshalb mit doppelten Pointern, weil du ja den Vorgänger des zu
    löschenden Knotens innerhalb der Rekursionsstufe des zu löschenden Knotens
    kennen musst, um seinen entsprechenden Nachfolger nach dem Löschvorgang auf NULL zu setzten.

    Mit einfachen Pointern müsste es aber auch gehen, dann müsstest du halt
    mit if-Abfragen arbeiten.

    Mfg



  • Hallo,

    leider ist mir der Mechanismus der dahinter steckt noch nicht so ganz bewusst. Ein doppelter Pointer ist doch quasi ein Zeiger auf einen anderen Zeiger der wiederrum auf ein Objekt zeigt. Beispielsweise folgender Codeausschnitt aus oben stehender Seite:

    else if((*zeiger)->links==NULL) {
             /* Nur rechter Nachfolger */
             temp = *zeiger;
             *zeiger=(*zeiger)->rechts;
             free(temp);
          }
    

    Hier wird der Fall behandelt, dass ein zu löschender Knoten nur einen rechten Nachfolger hat.
    Da wird doch zuerst ein Zeiger "temp" auf die Startaddresse des zu löschenden Knotens gesetzt. Anschließend wird der Zeiger umgesetzt auf die Startaddresse des Knotens der sich rechts von dem zu löschenden Knoten befindet. Zum Schluss wird dann der Knoten gelöscht. Doch der Vorgängerknoten des zu löschenden Knotens müsste doch jetzt eigentlich noch auf die Addresse des zu löschenden Knotens zeigen und nicht auf die des rechten Nachfolgers oder nicht???


Anmelden zum Antworten