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

Drzewo BST rotacja całego drzewa

Cloud VPS
0 głosów
336 wizyt
pytanie zadane 24 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)
edycja 24 maja 2018 przez criss

Cześć, napisałem funkcję rotującą drzewo BST mam tylko problem kiedy chciałbym działać na korzeniu. Poddrzewo lewe czy prawe normalnie rotuje, ale kiedy chcę użyć funkcji na korzeniu program się wywala albo tracę elementy drzewa.Jak mogę to poprawić?

struct tree_node *rotation_left(struct tree_node*root,struct tree_node*R)
{
   struct tree_node *y= (struct tree_node *)malloc(sizeof(struct tree_node));
   if(R->right_child)
   {
   y=R->right_child;
   R->right_child=y->left_child;
   if(y->left_child)
        y->left_child->parent=R;
    y->parent=R->parent;
    if(R->parent==NULL)
        root=y;
    else if(R==R->parent->left_child)
        R->parent->left_child=y;
    else
        R->parent->right_child=y;
    y->left_child=R;
    R->parent=y;
   }
    return R;

};

 

komentarz 24 maja 2018 przez criss Mędrzec (172,570 p.)
Ten malloc w 3. linii to tylko mem leak i nic więcej. Jeśli nie wejdzie w ifa, to wiadomo, a jeśli wejdzie, to w 6. linii masz wyciek.
komentarz 24 maja 2018 przez kikosiak Obywatel (1,010 p.)
usunięcie malloca coś pomoże?
komentarz 24 maja 2018 przez criss Mędrzec (172,570 p.)
W twoim problemie nie, dlatego w komentarzu :P Pomoże tyle, że nie będzie memleaka
komentarz 24 maja 2018 przez kikosiak Obywatel (1,010 p.)
A masz może jakiś pomysł jak mogę rozwiązać ten problem? Jeśli chcesz dam cały kod programu.

1 odpowiedź

0 głosów
odpowiedź 24 maja 2018 przez criss Mędrzec (172,570 p.)
wybrane 24 maja 2018 przez kikosiak
 
Najlepsza
Na pewno ten argument `root` jest bez sensu na ten moment. Skoro chcesz go modyfikować, to powinieneś brać adres roota a nie go kopiować. Tzn. niech funkcja bierze wskaźnik do roota.
Czyli: zamień parametr `root` na `struct tree_node** root`, a w 12. linii dopisz dereferencje `*root = y;`

To powinno rozwiązać problem, tym bardziej, że nie widze żadnego innego błędu..
komentarz 24 maja 2018 przez kikosiak Obywatel (1,010 p.)
Racja doszedłem w końcu do tego nawet bez podwojnego wskaznika. Po prostu nie zmienialem wartosci root w funkcji main. Glupi blad ale dzieki za odp.
komentarz 24 maja 2018 przez kikosiak Obywatel (1,010 p.)

@Criss, A jeśli chodzi o prostowanie drzewa możesz mi podać algorytm?

komentarz 24 maja 2018 przez criss Mędrzec (172,570 p.)
Sorry, ale nie mam pojęcia co to jest prostowanie drzewa :P
komentarz 24 maja 2018 przez kikosiak Obywatel (1,010 p.)
Chodziło mi o przekształcenie drzewa w listę, ale już ogarnąłem

Podobne pytania

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

93,488 zapytań

142,422 odpowiedzi

322,772 komentarzy

62,906 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

Kursy INF.02 i INF.03
...