Arboles Binarios

Nota: Utilizo el entorno de Dev-C++.
Hola, me registrado en esto fruto de la desesperación que tengo por haber repasado unas cuantas veces un programa que implementa la clase Árbol Binario. El Programa se estructura en un proyecto de 3 archivos, uno para el interfaz de la clase, otro para la implementación y otro que contiene la función main. Adujunto el contenido de los archivos de interfaz(ABinINT. Hpp) e implementación(ABinIMP.cpp), el programa compila bien, creo que el error debe de estar en algún fallo de concepto por mi parte en lo que se refiere a constructores de copia.
ABinINT. Hpp
class ABin {
public:
typedef int TipoElemento;
ABin ();
ABin (const ABin &ab);
~ABin ();
void Construir (const TipoElemento elem, ABin &izq, ABin &der);
TipoElemento Raiz ();
bool Vacio ();
ABin Derecho ();
ABin Izquierdo ();
private:
struct Nodo {
TipoElemento elem;
Nodo *izq, *der;
};
Nodo *nrz;
};
ABinIMP.cpp
#include <stdlib.h>
#include <iostream.h>
#include "ABinINT.hpp"
//ALGORITMOS AUXILIARES
//Algoritmo que copia toda la memoria de un puntero apunta a un nodo de un Arbol
//binario en otro. Es un Algoritmo de un gran coste de memoria pero asegura el
//contenido del arbol copiado;
void CopiarMemoria (ABin::Nodo *Dest, const ABin::Nodo *Orig){
//Caso base. El puntero origen es NULO. El puntero destino es NULO.
if (Orig == NULL)
Dest = NULL;
//Caso recursivo. El puntero origen no es NULO. El contenido del puntero destino
//es una copia del contenido del puntero origen, y sus enlaces son una copia de los
//enlaces del oigen.
else {
Dest = new (ABin::Nodo);
Dest -> elem = Orig -> elem;
CopiarMemoria (Dest -> izq, Orig -> izq);
CopiarMemoria (Dest -> der, Orig -> der);
}
}
//Algoritmo que libera toda la memoria de un puntro a un nodo de un árbol
void LiberarMemoria (ABin::Nodo *Ptr){
//Caso base. El puntero no apunta a ningún nodo. No hacemos nada.
//Caso recursivo. El puntero apunta al menos a un nodo. Eliminamos recursivamente
//todos los nodos.
if (Ptr != NULL){
LiberarMemoria (Ptr -> izq);
LiberarMemoria (Ptr -> der);
delete (Ptr);
}
}
//FUNCIONES MIEMBRO PÚBLICAS (MÉTODOS)
//Constructor por defecto. Construye un árbol vacío.
ABin::ABin (){
nrz = NULL;
}
//Constructor de Copia. Utilizamos el algoritmo auxiliar de CopiarMemoria.
ABin::ABin (const ABin &ab){
CopiarMemoria (nrz, ab.nrz);
}
//Destructor. Utilizamos el algoritmo auxiliar LiberarMemoria.
ABin::~ABin (){
LiberarMemoria (nrz);
}
//Construimos un arbol binario cuya raiz contiene el elemento elem, y sus subárboles
//izquierdo y derecho son izq y der respectivamente.
void ABin::Construir (ABin::TipoElemento elem, ABin &izq, ABin &der){
nrz = new (Nodo);
nrz -> elem = elem;
nrz -> izq = izq.nrz;
nrz -> der = der.nrz;
}
//Consultamos el elemento contenido en la raiz
ABin::TipoElemento ABin::Raiz (){
//Evidentemente solo consultamos si el árbol no está vacío
TipoElemento valor;
if (!Vacio())
valor = nrz -> elem;
return (valor);
//si el árbol está vacío se devuelve un valor residual.
}
//Si el árbol esta vacio devuelve true, sino devuelve falso
bool ABin::Vacio (){
return (nrz == NULL);
}
//Devuelve un objeto de la clase ABin que es una copia del subárbol derecho
//del objeto al que aplicamos este método
ABin ABin::Derecho (){
ABin d;//d es el objeto a devolver.
//Si el árbol contiene al menos un nodo, copiamos el hijo izqdo.
if (!Vacio())
d.nrz = nrz -> der;
return (d);
}
//Devuelve un objeto de la clase ABin que es una copia del subárbol izquierdo
//del objeto al que aplicamos este método
ABin ABin::Izquierdo (){
ABin i;//d es el objeto a devolver.
//Si el árbol contiene al menos un nodo, copiamos el hijo izqdo.
if (!Vacio())
i.nrz = nrz -> izq;
return (i);
}
Respuesta
1
No se que error te da pero creo que tienes un error. No puedes acceder al tipo de datos Nodo en ABinINT.cpp si este esta definido como privado en la clase. Saca tanto Nodo como TipoElemento de la declaración de la clase.
Yo he podido ejecutar un programa con esta clase (he utilizado .h en lugar de .hpp)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas