C ++ binært søketre Rekursiv søkefunksjonen

stemmer
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);                 
      }             
}

Så dette er min søkefunksjonen for min BST klasse med en T node. x er dataene som søkte på i treet, er len bare mengden av noder det har til å reise for å komme opp med den aktuelle noden hvis den finnes. Jeg har ikke implented det ennå, jeg bare gradvis utvikle min oppgave. Jeg kaller det ved å gjøre dette:

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

v er bare en vektor jeg måtte lage for å sammenligne det med, og slik at dette er bare å forsyne det med et int. Feilen jeg får:

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]

Så jeg er ikke sikker på hva jeg gjør galt eller hvor jeg gjør galt.

Publisert på 29/10/2008 klokken 02:44
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Ok, bool BST<T>::search(struct Node<T>*& root, const T& x)bør nok ha konst etter det som så: bool BST<T>::search(struct Node<T>*& root, const T& x) const. I utgangspunktet har du kalt en ikke-const funksjon fra en const funksjon, og dette er en no-no.

BTW, dette ser mistenkelig til meg " struct Node<T>*&" ... Jeg vil trolig slippe & og jobbe med Node<T>*... men kanskje du trenger det på grunn av struct ?

Også dette er C ++, er det ingen grunn til å forlate Node som en struct ... ønsker å ha struct i parameterdefinisjonen bare ser dårlig, IMHO. Hvorfor ikke gjøre Node en klasse?

Svarte 29/10/2008 kl. 02:49
kilden bruker

stemmer
0

algoritme:

  1. Ta noden verdi data;
  2. Gjenta trinn 3 til trinn 5 til vi finner verdien eller vi gå utover treet.
  3. Hvis dataene er lik rotnoden verdi, søking er vellykket og avslutte algoritmen.
  4. Hvis data er mindre enn rotnoden verdi, må vi søke venstre sub treet.
  5. Else data er mindre enn rotnoden verdi, må vi søke venstre sub treet.
  6. Utgang ut meldingen "Fant" eller "Not Found".

C ++ implementering

    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);
   }
Svarte 05/10/2016 kl. 18:30
kilden bruker

stemmer
1

Det er flere problemer i søkekoden:

  • Sorteringsrekkefølgen er bakover, hvis noden data er mindre enn hva du søker, bør du søke på riktig gren, ikke venstre gren.

  • Du bør returnere resultatet av rekursive kall

  • Det er også uklart hvorfor du passerer rootved referanse. Det bør i stedet sendes som et constkvalifisert pekeren og fremgangsmåte legeme bør constkvalifisert også.

Her er et alternativ:

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);
}

Og her er en enklere non rekursiv gjennomføring:

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;
}
Svarte 31/10/2016 kl. 20:18
kilden bruker

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