C ++ λειτουργία αναζήτησης Binary Search Tree Αναδρομικές

ψήφοι
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);                 
      }             
}

Έτσι, αυτό είναι συνάρτηση αναζήτησή μου για την κατηγορία BST μου με ένα κόμβο Τ. x είναι τα δεδομένα που αναζητείται μέσα στο δέντρο, len είναι μόνο η ποσότητα των κόμβων πρέπει να ταξιδέψει για να καταλήξει με τον κόμβο που ταιριάζουν, αν υπάρχει. Δεν έχω implented ότι ακόμα, είμαι μόνο σταδιακά αναπτύσσει αποστολή μου. Είμαι αυτό που ζητούν με τον τρόπο αυτό:

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

v είναι απλά ένας φορέας έπρεπε να δημιουργήσει για να το συγκρίνουμε με, και έτσι αυτό είναι ακριβώς αυτό προμηθεύει με μια int. Το σφάλμα Παίρνω:

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]

Έτσι, δεν είμαι σίγουρος τι κάνω λάθος ή αν κάνω λάθος.

Δημοσιεύθηκε 29/10/2008 στις 03:44
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
2

Εντάξει, bool BST<T>::search(struct Node<T>*& root, const T& x)θα πρέπει πιθανώς να έχετε const μετά αρέσει τόσο: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Βασικά, έχετε ονομάζεται μη-const λειτουργία από ένα const λειτουργία και αυτό είναι μια μη-όχι.

BTW, αυτό φαίνεται ύποπτο για μένα « struct Node<T>*&» ... θα ήθελα ίσως πέσει το & και να συνεργαστεί με Node<T>*... αλλά ίσως θα πρέπει να έχετε ότι λόγω της struct ;

Επίσης, αυτή είναι η C ++, δεν υπάρχει κανένας λόγος να φύγει Κόμβος ως struct ... χρειάζεται να έχουν struct στον ορισμό των παραμέτρων μόνο φαίνεται κακό, IMHO. Γιατί να μην κάνει Κόμβος μια τάξη;

Απαντήθηκε 29/10/2008 στις 03:49
πηγή χρήστη

ψήφοι
0

Αλγόριθμος:

  1. Πάρτε δεδομένα τιμής κόμβο?
  2. Επαναλάβετε το βήμα 3 έως το βήμα 5 μέχρι να βρούμε την τιμή ή να πάμε πέρα ​​από το δέντρο.
  3. Εάν τα δεδομένα είναι ίσο με ρίζα αξίας κόμβο, η αναζήτηση είναι επιτυχής και να τερματίσει τον αλγόριθμο.
  4. Εάν τα δεδομένα είναι μικρότερη από την αξία κόμβο, θα πρέπει να αναζητήσετε το αριστερό υπο δέντρο.
  5. Αλλιώς τα δεδομένα είναι μικρότερη από την αξία κόμβο, θα πρέπει να αναζητήσετε το αριστερό υπο δέντρο.
  6. Έξοδος το μήνυμα Εκτύπωση «βρέθηκε» ή «δεν βρέθηκε».

εφαρμογή C ++

    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);
   }
Απαντήθηκε 05/10/2016 στις 18:30
πηγή χρήστη

ψήφοι
1

Υπάρχουν πολλαπλά προβλήματα στον κώδικα αναζήτησή σας:

  • Η σειρά ταξινόμησης είναι προς τα πίσω, εάν τα δεδομένα του κόμβου είναι μικρότερο από αυτό που κάνετε, θα πρέπει να αναζητήσετε στο δεξιό κλάδο, δεν το αριστερό κλάδο.

  • Θα πρέπει να επιστρέψετε το αποτέλεσμα των αναδρομικών κλήσεων

  • Είναι επίσης σαφές γιατί περνάτε rootμε αναφορά. Πρέπει αντ 'αυτού να περάσει ως ένα constεξειδικευμένο δείκτη και το σώμα μέθοδος θα πρέπει να constχαρακτηριστεί πολύ.

Εδώ είναι μια εναλλακτική λύση:

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

Και εδώ είναι μια απλούστερη μη αναδρομική εφαρμογή:

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;
}
Απαντήθηκε 31/10/2016 στις 20:18
πηγή χρήστη

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