Drzewo bst - nie usuwa elementu z drzewa

0

Dlaczego usuwając liść w drzewie bst on się nie usuwa, jak wpisuje do niego wartość NULL w funkcji delete?

3

Bo nie usuwasz niczego. Przecież to

 wsk == NULL;

nic nie robi. Zapewne miałeś na myśli

wsk = NULL;

ale nawet wtedy to nic nie robi oprócz przypisywania NULL do jakiegoś tymczasowego wskaźnika.

Myślę, że powinieneś wrócić do lekcji ze wskaźnikami zanim się zabierzesz za poprawę tego programu.

0

Miało być wsk = Null lecz to nic nie zmienia.

1
twonek napisał(a):

Myślę, że powinieneś wrócić do lekcji ze wskaźnikami zanim się zabierzesz za poprawę tego programu.

0

A co jest nie tak?

0

wsk to ma byc wskaznik do tej liczby ktora usuwamy.

1
kaczor5373 napisał(a):

wsk to ma byc wskaznik do tej liczby ktora usuwamy.

Uwierz mi, ja wiem czym jest wsk w tamtym kodzie. Za to Ty nie rozumiesz jak działa wskaźnik, więc żeby w pełni wyjaśnić co robisz źle trzeba by wyjaśnić czym jest wskaźnik, stąd rekomendacja, żebyś jeszcze raz przerobił materiał z książki/tutoriala.

0

do wsk wpisuje potem adres null, czyli ten wskaznik nie powinien na nic pokazywac, wiec dlaczego zostaje tam liczba 2. Uzyc delete?

0

Przecież to, że ten tymczasowy wskaźnik już nie wskazuje na ten obiekt nie sprawia, że ten obiekt nagle magicznie zniknie. Pomijam już mało istotny w tym momencie fakt, że mogą istnieć inne wskaźniki wskazujące na ten obiekt, np. ojciec tego węzła.

Uzyc delete?
Cieplej.

0

Przecież już Ci mówiłem, że to

wsk = NULL;

nic nie robi.

Miałeś użyć delete, pokaż mi palcem gdzie to robisz.

0

Po usunięcie węzła nie aktualizowałeś wskaźnika w rodzicu, przez co nadal wskazywał na stare miejsce (które już nie jest poprawnym obiektem). Potrzebne jest coś w stylu

rodzic->prawy = NULL;

(to czy prawy czy lewy zależy od konkretnego przypadku).

Oczywiście żeby to zrobić trzeba nie tylko sam węzeł z daną wartością znaleźć, ale też jego rodzica.
Można to rozwiązać poprzez szukanie węzła, którego dziecko ma wartość liczba a nie węzła z tą wartością.

0

Jak można tak sobie życie utrudniać?!

    Wezel *ReturnWezel(int liczba)
    {
        for(Wezel *wsk=korzen;wsk;) if(liczba<wsk->liczba) wsk=wsk->lewy; else if(liczba>wsk->liczba) wsk=wsk->prawy; else break;
        return wsk;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1