Hola, estoy montando un proyecto con grafos, y por los momentos estoy implementando un template para declarar un arbol que necesito y sus respectivas operaciones adicional a un archivo testing.cpp que uso para probar todo. He logrado que el codigo de insercion de nodos funcione, pero el problema lo tengo al recorrer!
Implemente un procedimiento llamado recorrer que se supone atraviesa todo el arbol y (por los momentos) me imprime el valor de los nodos, aqui esta el codigo del template:
Código C++:
Ver original// Definiciones para arboles!
template <typename clase>
class hoja
{
public:
clase *contenido;
//Hijos
hoja <clase> *left;
hoja <clase> *right;
//Metodos constructores
hoja ()
{
left= NULL;
right= NULL;
contenido= NULL;
}
hoja (clase nuevo)
{
left= NULL;
right= NULL;
contenido= new clase;
*contenido= nuevo;
}
//Metodos set
void setContenido (clase nuevo)
{
contenido= new clase;
*contenido= nuevo;
}
void setLeft (hoja <clase> *n) { left = n; }
void setRight (hoja <clase> *n) { right= n; }
//Metodos get
hoja *getLeft () { return left; }
hoja *getRight () { return right; }
clase *getData () { return *contenido; }
//Operaciones
bool eshoja () { return (left==NULL && right==NULL); }
int gradonodo ()
{
int grado=0;
if (left!=NULL)
grado++;
if (right!=NULL)
grado++;
return grado;
}
};
template <typename clase>
class ArbinB
{
public:
hoja <clase> *ABB;
hoja <clase> *posicion;
ArbinB ()
{
ABB= NULL;
posicion= ABB;
}
//Operaciones
int insertar (clase e)
{
hoja <clase> *act;
hoja <clase> *padre;
bool encontrado;
act= ABB;
padre= NULL;
encontrado= false;
while (!encontrado && act!=NULL)
{
padre= act;
if (e.clave<act->contenido->clave)
act= act->left;
else
if (e.clave>act->contenido->clave)
act= act->right;
else
encontrado= true;
}
if (encontrado)
return -1;
else
{
hoja <clase> *aux= new hoja <clase> (e);
if (padre==NULL)
ABB=aux;
else
{
if (e.clave<padre->contenido->clave)
padre->left= aux;
else
padre->right=aux;
}
return 1;
}
}
};
//Operaciones
template <typename clase>
void recorrer (hoja <clase> ABB, int recorrido) //Donde recorrido= 0: simetrico, -1: preorden, 1: postorden
{
hoja <clase> *aux;
aux= ABB;
if (aux!=NULL)
{
switch (recorrido)
{
case -1:
//visitar();
printf ("\n%d", aux
->contenido
->clave
); recorrer (aux->left, -1);
recorrer (aux->right, -1);
break;
case 0:
recorrer (aux->left, 0);
//visitar();
printf ("\n%d", aux
->contenido
->clave
); recorrer (aux->right, 0);
break;
case 1:
recorrer (aux->left, 1);
recorrer (aux->right, 1);
//visitar();
printf ("\n%d", aux
->contenido
->clave
); break;
}
}
};
Y obtengo un error de compilacion en el testing.cpp en la linea recorrer (Arbol, 0) ;
Aqui el codigo del testing.cpp:
Código C++:
Ver original#include <stdlib.h>
#include <stdio.h>
#include "node_dealing.h"
using namespace std;
class contenido
{
public:
int clave;
contenido ()
{
clave=0;
}
};
int main ()
{
ArbinB <contenido> Arbol;
contenido c;
int k=0;
c.clave= 5;
k= Arbol.insertar (c);
c.clave= 7;
k= Arbol.insertar (c);
c.clave= 3;
k= Arbol.insertar (c);
c.clave= 9;
k= Arbol.insertar (c);
//printf ("\n%d", Arbol.ABB->contenido->clave);
//printf ("\n%d", Arbol.ABB->right->contenido->clave);
recorrer (Arbol, 0) ;
//Donde recorrido= 0: simetrico, -1: preorden, 1: postorden
}
Alguien tiene alguna idea de porque no se encuentra la funcion recorrer si esta esta declarada en el template y el mismo lo incluyo exitosamente (ya que como ven el resto de operaciones si funciona)
Gracias!