C ++ Binary Search Tree Recursief zoekfunctie

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

Dus dit is mijn zoekfunctie voor mijn BST klasse met een T-knooppunt. x is de data die worden gezocht naar de boom, len is slechts het bedrag van de knooppunten heeft om te reizen om te komen met de bijpassende knooppunt als het bestaat. Ik heb niet implented dat nog, ik ben gewoon stapsgewijs ontwikkelen van mijn opdracht. Ik noem het door dit te doen:

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

v is slechts een vector ik moest maken om het te vergelijken met, en dus dit is alleen het leveren van het met een int. De fout die ik krijg:

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]

Dus ik ben niet zeker wat ik verkeerd doe en waar ik verkeerd doe.

De vraag is gesteld op 29/10/2008 om 03:44
bron van user
In andere talen...                            


3 antwoorden

stemmen
2

Oke, bool BST<T>::search(struct Node<T>*& root, const T& x)moet waarschijnlijk const nadat het graag zo: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Kortom, je hebt een non-const functie van een const functie genaamd en dit is een no-no.

BTW, dit ziet er verdacht aan me " struct Node<T>*&" ... Ik zou waarschijnlijk laat de & en werken met Node<T>*... maar misschien moet je dat als gevolg van de structuur ?

Ook is dit C ++, is er geen reden om Node te verlaten als een structuur ... hoeven te hebben struct in de parameter definitie ziet er gewoon slecht, IMHO. Waarom niet Node een klasse te maken?

antwoordde op 29/10/2008 om 03:49
bron van user

stemmen
0

algoritme:

  1. Neem knooppunt waardegegevens;
  2. Herhaal stap 3 tot stap 5 totdat we de waarde te vinden of we verder gaan dan de boom.
  3. Als gegevens gelijk aan nodewaarde wortel is, zoeken is succesvol en het algoritme beëindigd.
  4. Als de gegevens minder dan hoofdknooppunt waarde is, moeten we de linker sub boom zoeken.
  5. Else gegevens minder dan root node waarde, moeten we de linker sub boom zoeken.
  6. Output Het bericht afdrukken "Found" of "Not Found".

C ++ implementatie

    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);
   }
antwoordde op 05/10/2016 om 18:30
bron van user

stemmen
1

Er zijn meerdere problemen in uw zoektocht code:

  • De volgorde is achteruit, of de node data minder dan wat u zoekt, moet je zoeken in de juiste branche, niet de linker tak is.

  • Je moet het resultaat van de recursieve aanroep terug

  • Het is ook onduidelijk waarom je voorbij rootaan de hand. moet in plaats daarvan worden doorgegeven als een constgekwalificeerde pointer en methodehoofdtekst worden constook gekwalificeerd.

Hier is een alternatief:

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

En hier is een eenvoudiger niet recursieve implementatie:

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;
}
antwoordde op 31/10/2016 om 20:18
bron van user

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