C ++ İkili Arama Ağacı Rekürsif arama fonksiyonu

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

Yani bu T düğümle benim BST sınıf için benim arama fonksiyonudur. x veri ağacına içinde, len o varsa eşleştirme düğümü ile gelip seyahat etmek zorunda düğümler miktarı adildir için Aratılan. Henüz, sadece aşamalı benim atama geliştiriyorum olduğunu implented değil. Bunu yaparak diyorum:

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

v ı karşılaştırmak için oluşturmak zorunda sadece bir vektör olduğunu ve bu yüzden bu sadece bir int ile tedarik edilir. Ben alıyorum hatası:

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]

Bu yüzden ben yanlış yapıyorum ya da nerede yanlış yapıyorum emin değilim.

Oluştur 29/10/2008 saat 03:44
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
2

Tamam, bool BST<T>::search(struct Node<T>*& root, const T& x)o kadar gibi sonra muhtemelen const sahip olmalıdır: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Temel olarak, bir const işlevinden bir const olmayan fonksiyon aradım ve bu bir hayır-hayır olduğunu.

BTW, bu "Bana tekin gözükmüyor struct Node<T>*&" ... muhtemelen damla & ve çalışmak istiyorum Node<T>*... ama belki, çünkü ihtiyacı yapı ?

Ayrıca, bu C ++ olduğunu olması gerek ... bir yapı olarak düğüm bırakmak için hiçbir neden yoktur yapı sadece kötü görünüyor, parametre tanımında IMHO. Neden Düğüm Bir sınıf yapmaz?

Cevap 29/10/2008 saat 03:49
kaynak kullanıcı

oy
0

Algoritma:

  1. düğüm değeri verileri almak;
  2. Biz değeri bulmak ya da biz ağacın ötesine kadar adım 3'ü tekrarlayın 5. adıma.
  3. bir veri düğümü değeri kök eşitse, arama başarılıdır ve algoritma sonlandırabilir.
  4. veri kök düğüm değerden az ise, biz sol alt ağacı aramak zorunda.
  5. Else veri kök düğüm değerinden düşük olduğunda, biz sol alt ağacı aramak zorunda.
  6. Çıktı Baskı mesaj "Found" veya "Bulunamadı".

C ++ uygulama

    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);
   }
Cevap 05/10/2016 saat 18:30
kaynak kullanıcı

oy
1

Arama kodunda birden sorunlar vardır:

  • düğüm veri arama, ne zaman doğru dalı değil, sol dal bulmak istediğiniz azsa sıralama düzeni, geriye gitmektir.

  • Sen özyinelemeli aramanın sonucunu dönmelidir

  • Eğer geçmesi nedeni de belli değildir rootreferans olarak. bunun yerine bir şekilde kabul edilmelidir constnitelikli işaretçi ve yöntem, vücut gereken constçok nitelikli.

İşte alternatiftir:

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

Ve burada daha basit olmayan özyinelemeli uygulamasıdır:

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;
}
Cevap 31/10/2016 saat 20:18
kaynak kullanıcı

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