Funcția de căutare binară de căutare recursive a arborelui C ++

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

Deci, aceasta este funcția mea de căutare pentru clasa mea BST cu un nod T. x este datele fiind căutat în copac, Len este doar cantitatea de noduri trebuie să se deplaseze pentru a veni cu nodul de potrivire în cazul în care acesta există. Nu am implented că încă, eu sunt în curs de dezvoltare doar treptat misiunea mea. Eu o chemare de a face acest lucru:

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

v este doar un vector a trebuit să creeze să-l compara cu, și astfel aceasta este doar furnizarea cu un int. Eroarea Sunt obtinerea:

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]

Deci, eu nu sunt sigur ce fac greșit sau în cazul în care fac greșit.

Întrebat 29/10/2008 la 03:44
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
2

Bine, bool BST<T>::search(struct Node<T>*& root, const T& x)ar trebui să aibă , probabil , Const după ce astfel: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Practic, ați apelat o funcție non-Const dintr - o funcție const și acest lucru este un nu-nu.

BTW, acest lucru pare suspect pentru mine „ struct Node<T>*&“ ... aș picătură , probabil, și de a lucra și cu Node<T>*... dar poate ai nevoie de asta , din cauza struct ?

De asemenea, acest lucru este C ++, nu există nici un motiv de a părăsi Node ca struct ... a fi nevoie să aibă struct în definiția parametru doar arată rău, IMHO. De ce nu face nod o clasă?

Publicat 29/10/2008 la 03:49
sursa de către utilizator

voturi
0

algoritm:

  1. Ia valoarea de date nod;
  2. Repetați pasul 3 până la pasul 5 până când vom găsi valoarea sau vom merge dincolo de copac.
  3. Dacă datele este egal cu rădăcină valoare nod, căutarea este de succes și se termină algoritmul.
  4. În cazul în care datele este mai mică decât valoarea nodului rădăcină, trebuie să caute sub copac din stânga.
  5. date altceva este mai mică decât valoarea nodului rădăcină, trebuie să caute sub copac din stânga.
  6. Ieșire Mesaj Print "S-au găsit" sau "Not Found".

implementare 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);
   }
Publicat 05/10/2016 la 18:30
sursa de către utilizator

voturi
1

Există mai multe probleme în codul de căutare:

  • Ordinea de sortare este invers, în cazul în care datele nod este mai mică decât ceea ce căutați, ar trebui să căutați în ramura dreaptă, nu ramura stângă.

  • Ar trebui să se întoarcă rezultatul apelului recursiv

  • De asemenea , este neclar de ce treci rootprin referință. ar trebui să fie în schimb a trecut ca un constindicator calificat și corpul metodei trebuie să fie constcalificat de asemenea.

Aici este o 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);
}

Și aici este o implementare recursiv non simplu:

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;
}
Publicat 31/10/2016 la 20:18
sursa de către utilizator

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