Función de búsqueda recursiva del árbol de búsqueda binaria C ++

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

Así que esta es mi función de búsqueda para mi clase BST con un nodo T. x es la información que se busca dentro del árbol, len es la cantidad de nodos que tiene que viajar para llegar al nodo correspondiente si existe. No lo he implementado todavía, estoy desarrollando gradualmente mi tarea. Lo estoy llamando al hacer esto:

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

v es solo un vector que tuve que crear para compararlo, y por lo tanto esto solo es suministrarle un int. El error que estoy recibiendo:

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]

Así que no estoy seguro de lo que estoy haciendo mal o de lo que estoy haciendo mal.

Publicado el 29/10/2008 a las 03:44
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

De acuerdo, bool BST<T>::search(struct Node<T>*& root, const T& x)probablemente debería tener const después de que de este modo: bool BST<T>::search(struct Node<T>*& root, const T& x) const. Básicamente, has llamado a una función no const desde una función const y esto es un no-no.

Por cierto, esto parece sospechoso para mí " struct Node<T>*&" ... probablemente dejaría caer & y trabajaría con Node<T>*... ¿pero quizás lo necesites por la estructura ?

Además, esto es C ++, no hay razón para dejar Node como una estructura ... la necesidad de tener struct en la definición del parámetro simplemente se ve mal, en mi humilde opinión. ¿Por qué no hacer que Node sea una clase?

Respondida el 29/10/2008 a las 03:49
fuente por usuario

votos
0

algoritmo:

  1. Tomar datos valor de nodo;
  2. Repita el paso 3 al paso 5 hasta que encontremos el valor o vamos más allá del árbol.
  3. Si los datos es igual al valor del nodo raíz, la búsqueda es exitosa y terminar el algoritmo.
  4. Si los datos es inferior al valor del nodo raíz, tenemos que buscar el árbol secundario hacia la izquierda.
  5. datos de los demás es inferior al valor del nodo raíz, tenemos que buscar el árbol secundario hacia la izquierda.
  6. Salida de mensaje de impresión "encontrado" o "no encontrado".

aplicación 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);
   }
Respondida el 05/10/2016 a las 15:30
fuente por usuario

votos
1

Hay varios problemas en su código de búsqueda:

  • El orden es al revés, si los datos de nodo es menos de lo que usted busca, usted debe buscar en la rama derecha, no la rama izquierda.

  • Usted debe devolver el resultado de la llamada recursiva

  • También está claro por qué se pasa rootpor referencia. en su lugar se debe pasar como un constpuntero calificado y el cuerpo del método debe ser constcalificado también.

Aquí hay una alternativa:

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

Y aquí es una implementación más simple no recursiva:

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;
}
Respondida el 31/10/2016 a las 17:18
fuente por usuario

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