C ++ bináris keresési fa rekurzív keresés funkció

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

Tehát ez az én keresési funkció az én BST osztály egy T csomópont. x az adataik keresett a fa, len csak az összeg a csomópontok azt utazni, hogy dolgozzon ki a megfelelő csomópontot, ha létezik. Még nem implented hogy még, én csak fokozatosan fejlődő megbízásom. Hívom azt csinál ez:

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

v csak egy vektor kellett létrehozni, hogy hasonlítsa össze, és így ez csak ellátása céljából az int. A hiba kapok:

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]

Szóval nem tudom, mit csinálok rosszul, vagy ha csinálok rosszul.

A kérdést 29/10/2008 03:44
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
2

Oké, bool BST<T>::search(struct Node<T>*& root, const T& x)valószínűleg van const után így néz ki: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Alapvetően, ha már az úgynevezett non-const funkciójuk a const funkciót, és ez egy nem-nem.

BTW, ez úgy néz ki gyanús nekem, hogy „ struct Node<T>*&” ... én valószínűleg csökken a & és a munka Node<T>*... de talán kell, hogy mivel a struct ?

Továbbá, ez a C ++, nincs ok arra, hogy csomópontra a struct ... szüksége, hogy a struktúra a paraméter definíció csak úgy néz ki rosszul, IMHO. Miért nem teszik Node egy osztály?

Válaszolt 29/10/2008 03:49
a forrás felhasználó

szavazat
0

algoritmus:

  1. Vegye csomópont értékére vonatkozó adatok;
  2. Ismételje meg a 3. lépést az 5. lépésre, amíg nem találunk az értéket vagy túllépünk a fát.
  3. Ha az adatok egyenlő gyökércsomópontra érték, a keresés sikeres, és megszünteti az algoritmust.
  4. Ha az adatok kisebb gyökér csomópont értékét, meg kell keresni a bal al-fa.
  5. Else adatok kevesebb gyökér csomópont értékét, meg kell keresni a bal al-fa.
  6. Nyomat message „talált”, vagy „nem található”.

C ++ végrehajtás

    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);
   }
Válaszolt 05/10/2016 18:30
a forrás felhasználó

szavazat
1

Vannak több problémát a keresés kód:

  • A sorrend visszafelé, ha a csomópont adatokat kevesebb, mint amit keres, meg kell keresni a megfelelő ág, nem a bal ág.

  • Vissza kell adnia az eredmény a rekurzív hívás

  • Az is világos, hogy miért adja át roothivatkozunk. ehelyett átadva constképzett mutató és az eljárás szervet kell constminősíteni is.

Itt van egy alternatíva:

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

És itt van egy egyszerűbb, nem rekurzív végrehajtását:

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;
}
Válaszolt 31/10/2016 20:18
a forrás felhasználó

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