Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con árboles binarios y clases

Estas en el tema de Problema con árboles binarios y clases en el foro de C/C++ en Foros del Web. Buenas tardes, es la primera vez que uso el foro :) Quisiera preguntar sobre el error "No matching function for call to.." realmente no encuentro ...
  #1 (permalink)  
Antiguo 17/11/2012, 16:18
Avatar de paula23andrea  
Fecha de Ingreso: noviembre-2012
Mensajes: 38
Antigüedad: 11 años, 5 meses
Puntos: 1
Pregunta Problema con árboles binarios y clases

Buenas tardes, es la primera vez que uso el foro :)
Quisiera preguntar sobre el error "No matching function for call to.." realmente no encuentro el error, cuando solo intento declarar en el main una dato tipo Nodo (que es el nombre de la clase)...
Aquí está el código, lo dejo completo por si hay algún error diferente.
#include <iostream>

using namespace std;

class Nodo
{
public:

//Nodo(const int dat, Nodo *izq=NULL, Nodo *der=NULL) :
// dato(dat), izquierdo(izq), derecho(der) {}

Nodo(const int dat )
{
dato=dat;
Nodo *izquierd=NULL;
Nodo *derecho=NULL;
}

int dato;
Nodo *izquierdo;
Nodo *derecho;
Nodo *raiz;
Nodo *actual;

void Insertar(const int dat);
bool Vacio(Nodo *r);
void recorre(void (*func)(int&) , Nodo *nodo=NULL, bool r=true);
void Mostrar(int&);

};


bool Nodo::Vacio(Nodo *r)
{
return r==NULL;
}

void Nodo::Insertar(const int dat)
{
Nodo *padre = NULL;

actual = raiz;
// Buscar el int en el árbol, manteniendo un puntero al nodo padre
while(!Vacio(actual) && dat != actual->dato) {
padre = actual;
if(dat > actual->dato) actual = actual->derecho;
else if(dat < actual->dato) actual = actual->izquierdo;
}

// Si se ha encontrado el elemento, regresar sin insertar
if(!Vacio(actual)) return;
// Si padre es NULL, entonces el árbol estaba vacío, el nuevo nodo será
// el nodo raiz
if(Vacio(padre)) raiz = new Nodo(dat);
// Si el int es menor que el que contiene el nodo padre, lo insertamos
// en la rama izquierda
else if(dat < padre->dato) padre->izquierdo = new Nodo(dat);
// Si el int es mayor que el que contiene el nodo padre, lo insertamos
// en la rama derecha
else if(dat > padre->dato) padre->derecho = new Nodo(dat);
}

void Nodo::recorre(void (*func)(int&), Nodo *nodo, bool r)
{
if (r) nodo =raiz;
func(nodo->dato);
if(nodo->izquierdo) recorre(func, nodo->izquierdo, false);
if(nodo->derecho) recorre(func, nodo->derecho, false);
}

void Mostrar(int &d)
{
cout << d << ",";
}

int main()
{
Nodo a;

a.Insertar(100);
a.Insertar(50);
a.Insertar(30);
a.Insertar(10);
a.Insertar(40);
a.Insertar(60);
a.Insertar(55);
a.Insertar(150);
a.Insertar(120);
a.Insertar(160);
a.Insertar(180);

cout<<"Recorrido: "<<endl;
a.recorre(Mostrar);

system("pause");
}

tengo dos modelos de constructor, y con ambos pasa lo mismo :(
"No matching function for call to 'Nodo::Nodo()

Agradezco su orientación, llevo varias horas con esto D:
  #2 (permalink)  
Antiguo 17/11/2012, 17:08
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con árboles binarios y clases

El error te dice que el constructor al que estas llamando no existe, pero si que existe un constructor del mismo nombre pero que espera un argumento del tipo 'const int'

Código:
//constructor
Nodo::Nodo(const int dat) {...}

//declaracion
const int dato = 0;
Nodo a(dato);

Y para el otro modelo pasa lo mismo:

Código:
//constructor
Nodo::Nodo(const int dat, Nodo *izq=NULL, Nodo *der=NULL) {...}

//declaracion
Nodo a(0, NULL, NULL);
//aqui puedes omitir los argumentos por defecto
Nodo a(0);
No me he mirado las funciones (y no creo que lo haga), pero se supone que el argumento con el que inicializas la clase tiene que ser algo con sentido (en el ejemplo he usado 0, me lo he inventado)

Saludos
vosk
  #3 (permalink)  
Antiguo 17/11/2012, 17:15
Avatar de paula23andrea  
Fecha de Ingreso: noviembre-2012
Mensajes: 38
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Problema con árboles binarios y clases

Efectivamente ése era el problema, pero al ejecutarse "revienta" ah, que desagradable me resultan este tipo de estructuras....

Muchas gracias
  #4 (permalink)  
Antiguo 18/11/2012, 10:21
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problema con árboles binarios y clases

"...pero al ejecutarse "revienta"..."

Ya, revisa tu codigo pq puede que estes haciendo algo mal; creo que deberías echar un vistazo a algun manual de listas enlazadas antes de continuar.

Y a demas, cuando reservas bloques de memoria con el operador 'new' tienes que liberarlos con 'delete' (en teoria los s.o. actuales recuperan la memoria bloquedada al finalizar el proceso), ya tienes mas trabajo

Saludos
vosk
  #5 (permalink)  
Antiguo 18/11/2012, 11:39
Avatar de paula23andrea  
Fecha de Ingreso: noviembre-2012
Mensajes: 38
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Problema con árboles binarios y clases

Es que, en realidad lo que tengo que hacer es un árbol binario, donde se tiene que hacer el recorrido inverso por amplitud, es decir, recorrer por niveles de izquierda a derecha desde abajo.
Ya tengo bien la función de captura, el problema es la función de recorrido, que se tiene que implementar con colas, y el asunto se complica mucho, es código es muy largo para pegarlo, no creo que acá estén interesados en entenderlo :)
De todas formas muchísimas gracias!!
  #6 (permalink)  
Antiguo 21/11/2012, 16:47
 
Fecha de Ingreso: noviembre-2012
Mensajes: 24
Antigüedad: 11 años, 5 meses
Puntos: 3
Respuesta: Problema con árboles binarios y clases

Cita:
Iniciado por paula23andrea Ver Mensaje
Es que, en realidad lo que tengo que hacer es un árbol binario, donde se tiene que hacer el recorrido inverso por amplitud, es decir, recorrer por niveles de izquierda a derecha desde abajo.
Ya tengo bien la función de captura, el problema es la función de recorrido, que se tiene que implementar con colas, y el asunto se complica mucho, es código es muy largo para pegarlo, no creo que acá estén interesados en entenderlo :)
De todas formas muchísimas gracias!!
Vos queres recorrer un arbol por niveles? Si es asi el algoritmo que lo resuelve podria ser el [URL="http://es.wikipedia.org/wiki/Búsqueda_en_anchura"]BFS[/URL]. Si bien es para grafos, un arbol es un grafo asique no tendrias inconvenientes.

Saludos.
  #7 (permalink)  
Antiguo 18/03/2013, 19:16
 
Fecha de Ingreso: marzo-2013
Mensajes: 2
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Problema con árboles binarios y clases

paula23andrea como resolviste el problema de recorrer el arbol binario en amplitud( BFS) pasandole una funcion de comparacion y no una cola??

Etiquetas: clases, errores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:28.