C ++ binärer Suchbaum rekursive Suchfunktion

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

Das ist also meine Suchfunktion für meine BST-Klasse mit einem T-Knoten. x die Daten innerhalb des Baumes werden gesucht, Len nur die Menge der Knoten ist es mit dem passenden Knoten zurückzulegen hat, zu kommen, wenn es vorhanden ist. Ich habe das noch nicht zuzurAufnahme, bin ich nur meine Aufgabe schrittweise zu entwickeln. Ich rufe sie durch dies zu tun:

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

v ist nur ein Vektor musste ich schaffen es, zu vergleichen und so wird diese Versorgung es nur mit einem int. Der Fehler Ich erhalte:

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]

So bin ich nicht sicher, was ich falsch mache oder wo ich falsch mache.

Veröffentlicht am 29/10/2008 um 03:44
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Okay, bool BST<T>::search(struct Node<T>*& root, const T& x)sollte wahrscheinlich haben const nach mag es so: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Grundsätzlich haben Sie eine nicht-konstante Funktion von einer konstanten Funktion genannt und das ist ein No-No.

BTW, vermuten , dass dieses mir aussieht „ struct Node<T>*&“ ... Ich würde wahrscheinlich fallen die & und die Arbeit mit Node<T>*... aber vielleicht brauchen Sie , dass aufgrund der Struktur ?

Auch dies ist C ++, gibt es keinen Grund Knoten als eine Struktur verlassen ... zu müssen haben struct in der Parameterdefinition nur schlecht aussieht, IMHO. Warum nicht eine Klasse machen Knoten?

Beantwortet am 29/10/2008 um 03:49
quelle vom benutzer

stimmen
0

Algorithmus:

  1. Nehmen Knotenwertdaten;
  2. Wiederholen Sie Schritt 3 Schritt 5, bis wir den Wert zu finden, oder wir über den Baum gehen.
  3. Wenn Daten, die gleich ist der Knoten Wert zu verankern, ist die Suche erfolgreich ist, und der Algorithmus beendet.
  4. Wenn die Daten weniger als Wurzelknoten Wert ist, müssen wir den linken Unterbaum suchen.
  5. Else Daten kleiner als Wurzelknoten Wert haben wir den linken Unterbaum zu suchen.
  6. Ausgabe Druck Meldung „gefunden“ oder „nicht gefunden“.

C ++ Implementierung

    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);
   }
Beantwortet am 05/10/2016 um 18:30
quelle vom benutzer

stimmen
1

Es gibt mehrere Probleme bei der Suche Code:

  • Die Sortierreihenfolge ist nach hinten, wenn die Knoten Daten kleiner als das, was Sie suchen, können Sie in dem rechten Zweig suchen sollen, nicht der linke Zweig.

  • Sie sollten das Ergebnis des rekursiven Aufrufs zurückkehren

  • Es ist auch unklar , warum Sie übergeben rootBezug genommen wird . es sollte stattdessen als übergeben werden constqualifizierte Zeiger und das Verfahren Körper sollte constqualifiziert zu.

Hier ist eine Alternative:

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

Und hier ist ein einfacher nicht rekursive Implementierung:

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;
}
Beantwortet am 31/10/2016 um 20:18
quelle vom benutzer

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