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

wyszukiwanie elementu w drzewie binarnym

0 głosów
1,260 wizyt
pytanie zadane 29 maja 2015 w C i C++ przez fraktal Nowicjusz (200 p.)

Mam problem z napisaniem funkcji wyszukującej element o zadanym kluczu.
Macie pomysł jaki jest błąd w tej rekurencji?

Tree* search(Tree *root, int x)
{
	if (root == NULL) return NULL;
	if (root->key == x) return root;
	if (root->left) search(root->left, x);
	if(root->right) search(root->right, x);
}

 

4 odpowiedzi

0 głosów
odpowiedź 29 maja 2015 przez Kozerski Igor Użytkownik (610 p.)
edycja 29 maja 2015 przez Kozerski Igor
przede wszystkim nie sprawdzaj czy lewy i prawy wskaźnik istnieją tylko

Tree* search(Tree *root, int x)

{

if (root == NULL) return NULL;

if (root->key == x) return root;

if (root->key<x) search(root->left, x);///tu możesz dać else

if(root->key>x) search(root->right, x);
}
 

if (root->left) taki zapis odpowiada if(root->left!=NULL)
komentarz 30 maja 2015 przez fraktal Nowicjusz (200 p.)
Tylko, że nie jest to drzewo BST, tylko po prostu drzewo binarne, więc niekoniecznie element o mniejszym kluczu będzie po lewej, co komplikuje problem. :(
0 głosów
odpowiedź 30 maja 2015 przez Pan Kulomb Pasjonat (18,630 p.)
To zwraca NULL?
0 głosów
odpowiedź 30 maja 2015 przez Kozerski Igor Użytkownik (610 p.)
sorki myślałem że chodzi o uporządkowane, ale jeśli nie jest uporządkowane to najlepiej dać wszystkie elementy do listy i po niej szukać, nieuporządkowane drzewo traci swoje właściwości niskiej złożoności obliczeniowej

 

to co napisałeś nie bedzie działać, bo napodkanie returna wcale nie kończy innych rekurencji które wywołałeś

pozdrawiam
komentarz 30 maja 2015 przez fraktal Nowicjusz (200 p.)
masz rację, właśnie myślałem że return wyjdzie mi z funkcji, ale okazuje się że zostaną jeszcze inne wywołane przed nią i nie wiadomo bardzo co z tym zrobić.

Niestety, szukanie po liście mi nie wystarczy, bo muszę zbudować konkretne drzewo w celu dekompresji pliku.

Pozdrawiam
0 głosów
odpowiedź 27 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
edycja 27 lipca 2015 przez Szykem2

Ja bym próbował w taki sposób:

Tree* search(Tree *root, int x)
{
    if (root == NULL) return NULL;
    if (root->key == x) return root;
     
    if (root->left)
    {
         Tree* l = search(root->left, x);
    }
    
    if(l !=NULL)
    {
         return l;
    }

    if (root->right)
    {
         Tree* l = search(root->right, x);
    }
    else
    {
         return NULL;
    }

    if(r !=NULL)
    {
         return r;
    }

    return NULL;
}

Nie jestem pewien czy będzie w tej formie działeć. Teraz nie mam jak tego sprawdzić. Jednak koncepcyjnie jest w porządku.

Podobne pytania

+1 głos
1 odpowiedź 688 wizyt
pytanie zadane 16 czerwca 2015 w Algorytmy przez Jaskrowicz Obywatel (1,210 p.)
+8 głosów
5 odpowiedzi 1,433 wizyt
0 głosów
1 odpowiedź 939 wizyt
pytanie zadane 9 marca 2019 w Java przez mn130496 Gaduła (3,640 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...