C ++ функции поиска Двоичного дерева Рекурсивной

голоса
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 класса с Т-узлом. х данные разыскиваются в дереве, длина только количество узлов, которые он должен пройти, чтобы придумать с узлом согласования, если он существует. Я не implented, что пока я просто постепенно развивается мое назначение. Я звоню его, делая это:

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

v это просто вектор я должен был создать, чтобы сравнить его, и так это просто поставляет его с междунар. Ошибка я получаю:

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)вероятно , следует иметь сопзЬ после нравится так: bool BST<T>::search(struct Node<T>*& root, const T& x) const. В принципе, вы назвали неконстантной функцией из константной функции , и это не является ни-ни.

Кстати, это выглядит подозреваемого мне « struct Node<T>*&» ... Я бы , вероятно , опускать и и работать с Node<T>*... но , возможно , вам нужно , что из-за структуры ?

Кроме того , это C ++, нет никаких причин , чтобы оставить узел как структура ... необходимости иметь - структуру в определении параметра просто плохо выглядит, имхо. Почему бы не сделать Node класс?

Ответил 29/10/2008 в 03:49
источник пользователем

голоса
0

Алгоритм:

  1. Возьмем данные значения узла;
  2. Повторите шаг 3 шаг 5, пока мы не найдем значение или мы выходим за пределы дерева.
  3. Если данные равны укоренить значение узла, поиск успешно и завершить алгоритм.
  4. Если данные меньше, чем значение корневого узла, мы должны искать левую суб дерево.
  5. Else данных меньше, чем значение корневого узла, мы должны искать левую суб дерево.
  6. Выведите сообщение «Найдено» или «Not Found».

реализация 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