C ++ funzione di ricerca binaria Ricerca Albero ricorsivo

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

Quindi questa è la mia funzione di ricerca per la mia classe BST con un nodo T. x è i dati da ricercare all'interno dell'albero, len è solo la quantità di nodi che deve percorrere per venire con il corrispondente nodo se esiste. Non ho implented che ancora, sto solo in modo incrementale sviluppare il mio incarico. Sto chiamando in questo modo:

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

v è solo un vettore ho dovuto creare per confrontarlo, e così questo è solo la fornitura con un int. L'errore che sto ricevendo:

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]

Quindi io non sono sicuro di quello che sto facendo male o dove sto facendo male.

È pubblicato 29/10/2008 alle 03:44
fonte dall'utente
In altre lingue...                            


3 risposte

voti
2

Va bene, bool BST<T>::search(struct Node<T>*& root, const T& x)avrebbe meritato const dopo che in questo modo: bool BST<T>::search(struct Node<T>*& root, const T& x) const. In sostanza, avete chiamato una funzione non const da una funzione const e questo è un no-no.

BTW, questo sembra sospetto a me " struct Node<T>*&" ... probabilmente sarei cadere la & e lavorare con Node<T>*... ma forse bisogno che a causa della struct ?

Inoltre, questo è C ++, non v'è alcun motivo per lasciare nodo come struct ... bisogno di avere struct nella definizione dei parametri sembra proprio male, IMHO. Perché non fare il nodo di una classe?

Risposto il 29/10/2008 a 03:49
fonte dall'utente

voti
0

algoritmo:

  1. Prendere nodo di dati di valore;
  2. Ripetere il punto 3 al punto 5 fino a trovare il valore o andiamo oltre l'albero.
  3. Se i dati è uguale al valore del nodo radice, la ricerca ha successo e terminare l'algoritmo.
  4. Se i dati è inferiore al valore nodo principale, dobbiamo cercare l'albero sub sinistra.
  5. Dati Else è inferiore al valore nodo principale, dobbiamo cercare l'albero sub sinistra.
  6. Uscita messaggio Print "Trovato" o "Not Found".

implementazione 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);
   }
Risposto il 05/10/2016 a 18:30
fonte dall'utente

voti
1

Ci sono molteplici problemi nel codice di ricerca:

  • L'ordinamento è indietro, se i dati nodo è inferiore a quello che si cerca, si dovrebbe cercare nel ramo di destra, non il ramo di sinistra.

  • Si dovrebbe restituire il risultato della chiamata ricorsiva

  • E 'anche chiaro perché si passa rootper riferimento. dovrebbe invece essere passato come constpuntatore qualificato e il corpo del metodo dovrebbe essere constqualificato troppo.

Ecco un'alternativa:

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

Ed ecco un semplice implementazione non ricorsiva:

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;
}
Risposto il 31/10/2016 a 20:18
fonte dall'utente

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