• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie poprzednika z drzewa BST

Object Storage Arubacloud
0 głosów
374 wizyt
pytanie zadane 28 maja 2018 w Algorytmy przez piotrrussw Nowicjusz (240 p.)

Mam problem z zadaniem, mam napisać funkcje Update, którą podzieliłem sobie na mniejsze części, nie wnikając:

Znajduje poprzednik w drzewie BST (założenie, że zawsze ma przynajmniej lewe poddrzewo)

Zmieniam jego wartość dodając do niego wartość korzenia

Usuwam poprzednik z drzewa BST

Znajduje korzen

Dodaje na odpowiednie miejsce poprzednik.

Problem mam z usunięciem poprzednika, bo nie wiem jak zrobić warunek jeśli ma lewe dziecko, a potem poddrzewa itd. Tyle wykombinowałem, ktoś umie pomóc? Będę bardzo wdzięczny.

BSTdelete(BSTnode *node, BSTnode *&p) {
    value = node->key;
    if(p->left == node) {  //if predecessor has no children
        p->left = node->left;
        node->left->parent =p;
    else if (...) // i dont know how to do it when it has left child and then left child have children...
    }
    else {
        node->parent->right = NULL;
    }
    delete node;
    return value;
}

 

komentarz 28 maja 2018 przez Łukasz Wasilewski Mądrala (5,190 p.)

Nie za bardzo rozumiem problem. Czym jest p? Z kodu wnioskuje, że rodzicem właśnie tego węzła node, tylko że komentarz wtedy bez sensu, bo przecież sprawdzasz czy lewy potomek rodzica jest węzłem, który planujemy usunąć i prawidłowo w ifie podmieniasz wskaźniki. 

 

komentarz 28 maja 2018 przez piotrrussw Nowicjusz (240 p.)
To może spróbuje inaczej, treść brzmi tak:

Dane jest drzewo BST wskazywane przez Root (implementacja wskaźnikowa). Napisz funkcję Update, której argumentem jest wskaźnik do węzła p mającego przynajmniej lewe poddrzewo, i która zmodyfikuje wartość klucza poprzednika węzła p, dodając do przechowywanej wartości w poprzedniku wartość korzenia. Przywróć strukturze drzewa własność BST. Zdefiniuj wszystkie potrzebne struktury, zmienne i funkcje.

I już dochodząc do momentu usuwania nie umiem rozwiązać przypadku kiedy poprzednik ma lewe dziecko, (po prostu nie wiem jakie warunki tam dać, że to usuwać prawidłowo)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 727 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Zielony12 Nowicjusz (200 p.)
0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 4 lutego 2020 w C i C++ przez Kate1243 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...