C ++ Binární vyhledávací strom rekurzivní funkce vyhledávání

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

Tak tohle je moje vyhledávací funkce pro mé BST třídě T uzlu. x je data, která jsou vyhledávány v rámci stromu, len je právě množství uzlů, musí cestovat do přijít s uzlem odpovídající, pokud existuje. Nemám implented, že přesto, já jen postupně vyvíjí svůj úkol. Volám to tím, že dělá toto:

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

v je jen vektor měl jsem vytvořit porovnat jej, a tak toto je to jen dodává s int. Chyba Začínám:

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]

Takže si nejsem jistý, co dělám špatně, nebo kde dělám špatně.

Položena 29/10/2008 v 03:44
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
2

Dobře, bool BST<T>::search(struct Node<T>*& root, const T& x)měli pravděpodobně mít const poté, co chtěl, aby: bool BST<T>::search(struct Node<T>*& root, const T& x) const. V podstatě jste volal non-const funkce z const funkce a to je ne-ne.

BTW, to vypadá podezřelý ke mně „ struct Node<T>*&“ ... Asi bych drop-a pracovat s nimi Node<T>*... ale možná budete potřebovat, že vzhledem k struct ?

Také, to je C ++, není žádný důvod k odchodu uzel jako struct ... museli mít struct v definici parametrů prostě vypadá špatně, IMHO. Proč ne, aby Node třída?

Odpovězeno 29/10/2008 v 03:49
zdroj uživatelem

hlasů
0

algoritmus:

  1. Vezměte uzlu hodnotu dat;
  2. Opakujte krok 3 až krok 5, dokud nenajdeme hodnotu nebo můžeme jít nad rámec stromu.
  3. Pokud jsou data se rovná zakořenit hodnotu uzlu, vyhledávání je úspěšné a ukončit algoritmus.
  4. Pokud jsou data je nižší než hodnota kořene, musíme hledat levý dílčí strom.
  5. Else dat je nižší než hodnota kořene, musíme hledat levý dílčí strom.
  6. Výstup tisku zpráva „nalezen“ nebo „Not Found“.

C ++ implementace

    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);
   }
Odpovězeno 05/10/2016 v 18:30
zdroj uživatelem

hlasů
1

Existuje několik problémů v zadaný kód:

  • Pořadí řazení je směrem dozadu, pokud jsou data uzlu je menší než to, co hledáte, měli byste hledat v pravé větvi, nikoli levé větve.

  • Měli byste se vrátit výsledek rekurzivní volání

  • Je také jasné, proč si projít rootodkazem. to by mělo být místo toho předán jako constkvalifikovaný ukazatel a metoda orgán by měl být constkvalifikován taky.

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

A tady je jednodušší než rekurzivní realizace:

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;
}
Odpovězeno 31/10/2016 v 20:18
zdroj uživatelem

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