Binary Recherche Arbre récursif fonction de recherche C de

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

Voici donc ma fonction de recherche de ma classe BST avec un noeud T. x est les données recherchées dans l'arbre, len est juste la quantité de noeuds, il doit se déplacer pour venir avec le noeud correspondant si elle existe. Je ne l'ai pas encore implenté que, je développe progressivement tout simplement ma mission. Je l'appeler en faisant ceci:

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

v est juste un vecteur je devais créer de la comparer, et si cela est juste fournit avec un int. L'erreur que je reçois:

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]

Je ne suis pas sûr de ce que je fais mal ou si je fais mal.

Créé 29/10/2008 à 03:44
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

D' accord, bool BST<T>::search(struct Node<T>*& root, const T& x)devrait probablement const après comme ceci: bool BST<T>::search(struct Node<T>*& root, const T& x) const. En gros, vous avez appelé une fonction non-const d'une fonction const et c'est un non-non.

BTW, cela me semble suspect « struct Node<T>*&» ... Je serais probablement tomber le & et travailler avec Node<T>*... mais peut - être vous avez besoin que du fait de la struct ?

En outre, c'est C ++, il n'y a aucune raison de quitter Node comme struct ... avoir besoin de struct dans la définition des paramètres semble tout simplement mauvais, à mon humble avis. Pourquoi ne pas faire de nœud une classe?

Créé 29/10/2008 à 03:49
source utilisateur

voix
0

algorithme:

  1. Prendre des données de valeur de noeud;
  2. Répétez l'étape 3 à l'étape 5 jusqu'à ce que nous trouvons la valeur ou nous allons au-delà de l'arbre.
  3. Si des données est égale à la racine valeur de nœud, la recherche est couronnée de succès et mettre fin à l'algorithme.
  4. Si des données est inférieure à la valeur de nœud racine, il faut rechercher l'arbre secondaire gauche.
  5. données Else est inférieure à la valeur nœud racine, il faut rechercher l'arbre secondaire gauche.
  6. Sortie Imprimer le message "introuvable" ou "Not Found".

la mise en œuvre C de

    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);
   }
Créé 05/10/2016 à 18:30
source utilisateur

voix
1

Il y a plusieurs problèmes dans votre code de recherche:

  • L'ordre de tri est en arrière, si les données de noeud est inférieure à ce que vous recherchez, vous devez rechercher dans la branche droite, pas la branche gauche.

  • Vous devez retourner le résultat de l'appel récursif

  • On ne sait pas pourquoi vous passez rootpar référence. il devrait plutôt être passé comme un constpointeur qualifié et le corps de méthode doit être constqualifié aussi.

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

Et voici une implémentation récursive simple non:

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;
}
Créé 31/10/2016 à 20:18
source utilisateur

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