Funkcja wyszukiwania C ++ Binary Search drzewo rekurencyjny

głosy
2
template <class T>
bool BST<T>::search(const T& x, int& len) const
{
    return search(BT<T>::root, x);
}


template <class T>
bool BST<T>::search(struct Node<T>*& root, const T& x)
{
   if (root == NULL)
       return false;
   else
      {
         if (root->data == x)
             return true;
         else if(root->data < x)
             search(root->left, x);
         else 
             search(root->right, x);                 
      }             
}

Więc to jest moja funkcja wyszukiwania dla mojej klasy BST z węzła T. x to dane są wyszukiwane w drzewie, len jest właśnie ilość węzłów musi podróżować wymyślić węzła pasującego jeśli istnieje. Nie implented że jeszcze, ja tylko stopniowo rozwija moje zadanie. Wołam go w ten sposób:

if(t.search(v[1], len) == true)
       cout << endl << true;

v jest wektorem prostu musiałem stworzyć porównać go, a więc jest to po prostu dostarczanie go z wew. Błąd Dostaję:

BST.h: In member function âbool BST<T>::search(const T&, int&) const [with T = int]â:
prog5.cc:24:   instantiated from here    
BST.h:78: error: no matching function for call to âBST<int>::search(Node<int>* const&, const int&) constâ    
BST.h:76: note: candidates are: bool BST<T>::search(const T&, int&) const [with T = int]
BST.h:83: note:                 bool BST<T>::search(Node<T>*&, const T&) [with T = int]

Więc nie jestem pewien, co robię źle lub gdy robię źle.

Utwórz 29/10/2008 o 03:44
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
2

Ok, bool BST<T>::search(struct Node<T>*& root, const T& x)prawdopodobnie powinien mieć const po to tak: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Zasadniczo masz zwany non-const const funkcja od funkcji i jest to nie-nie.

BTW, to wygląda podejrzanego do mnie „ struct Node<T>*&” ... pewnie bym upuść & i pracować z Node<T>*... ale może trzeba, że ze względu na struktury ?

Ponadto, jest to C ++, nie ma powodu, aby zostawić jak struct Node ... potrzebuje mieć struct w definicji parametrów wygląda po prostu źle, IMHO. Dlaczego nie zrobić węzeł A klasa?

Odpowiedział 29/10/2008 o 03:49
źródło użytkownik

głosy
0

algorytm:

  1. Take danych wartość węzła;
  2. Powtórz krok 3 do krok 5, dopóki nie znajdziemy wartość lub wychodzimy poza drzewem.
  3. Jeśli danych jest równa wartości węzła roota, wyszukiwanie jest udany i zakończenia algorytmu.
  4. Jeśli danych jest mniejsza niż wartość węzła głównego, musimy przeszukać drzewo lewą sub.
  5. Jeszcze danych jest mniejsza niż wartość węzła głównego, musimy przeszukać drzewo lewą sub.
  6. Wyjście wiadomość Drukuj „Found” lub „nie znaleziono”.

implementacja C ++

    node* search(node* root, int data)
    {
     if (root==NULL || root->data==data) return root;

     if (root->data < data)   return search(root->right, data);

     return search(root->left, data);
   }
Odpowiedział 05/10/2016 o 18:30
źródło użytkownik

głosy
1

Istnieje wiele problemów w kodzie wyszukiwania:

  • Kolejność sortowania jest do tyłu, jeśli dane węzeł jest mniejsza niż to, czego szukać, należy szukać we właściwym oddziale, a nie lewej odnogi.

  • Należy zwrócić wynik wywołania rekurencyjnego

  • Nie jest też jasne, dlaczego przechodzą rootprzez odniesienie. powinien on zamiast zostać przekazany jako constwykwalifikowany wskaźnikiem a ciało metoda powinna być constzakwalifikowana też.

Oto alternatywa:

template <class T>
bool BST<T>::search(const struct Node<T> *root, const T& x) const {
    if (root == NULL)
        return false;
    else
    if (root->data == x)
        return true;
    else
    if (root->data < x)
        return search(root->right, x);
    else 
        return search(root->left, x);
}

I tu jest prostsze niż rekurencyjna realizacja:

template <class T>
bool BST<T>::search(const struct Node<T> *root, const T& x) const {
    while (root != NULL) {
        if (root->data == x)
            return true;
        if (root->data < x)
            root = root->right;
        else 
            root = root->left;
    }
    return false;
}
Odpowiedział 31/10/2016 o 20:18
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more