[C con Clase] Ayuda
carlos martinez gadea
tupy4 en hotmail.com
Dom Jun 7 16:01:13 CEST 2009
Buenas,
ante todo decirte que esta es una lista en la que ayudamos a revolser problemas, y no nos expones tu problema. Nos dices que es un programa de arboles binarios que marca errores...no ayudas mucho con tu error, danos más información y así será más fácil ayudarte. Podría compilar el código y ponerme a revisar yo mismo, pero entonces estaría haciendote el trabajo y no es lo que se persigue en esta lista.
Un saludo y espero la exposición del problema bien explicada.
From: maufem en live.com.mx
To: cconclase en listas.conclase.net
Date: Sat, 6 Jun 2009 23:24:18 -0500
Subject: [C con Clase] Ayuda
Hola, leo su pagina y me ayudo de ella, muy interesante, pero necesito ayuda con un programa, espero contar con su ayuda a la brevedad posible si no es molestia, se trata de un programa de arboles binarios que marca errores, que no he encontrado solucion. Por su atencion gracias
#include <iostream.h>
#include <conio.h>
class Nodo
{
private:
Nodo *izquierdo;
int dato;
Nodo *derecho;
public:
Nodo(int dat, Nodo *izq=NULL, Nodo *der=NULL): dato (dat), izquierdo(izq), derecho(der){}
friend class Arbol;
};
typedef Nodo*pNodo;
class Arbol
{
private:
pNodo raiz;
pNodo actual;
int contador;
int altura;
void Insertar (int, pNodo&);
void Podar (pNodo&);
void auxContador (pNodo);
void auxAltura (pNodo, int);
void In (pNodo);
void Pre (pNodo);
void Post (pNodo);
pNodo Buscar (int, pNodo, int&);
pNodo Busdersubizq (pNodo);
pNodo Busizqsubder (pNodo);
pNodo Padre (pNodo, pNodo);
void Alt (int, pNodo, int&);
public:
Arbol():raiz(NULL), actual(NULL){}
~Arbol(){Podar(raiz);}
void Insertar (int dat){Insertar(dat, raiz);}
void Raiz(){actual=raiz;}
void InOrden(){Raiz(); In(actual);}
void PreOrden(){Raiz(); Pre(actual);}
void PostOrden(){Raiz(); Post(actual);}
void Borrar (int);
pNodo Vacio (pNodo r){return r=NULL;}
int EsHoja (pNodo r){return !r->derecho&&!r->izquierdo;}
int NumeroNodos ();
int AlturaArbol ();
int Altura (int);
int &ValorActual(){return actual->dato;}
};
void Arbol::Insertar (int dat, pNodo &raiz)
{
pNodo a=raiz;
if(a==NULL)
raiz=new Nodo(dat);
else
if(dat<=a->dato)
Insertar(dat, a->izquierdo);
else
Insertar(dat,a->derecho);
}
void Arbol::In(pNodo actual)
{
if(actual!=NULL)
{
In(actual->izquierdo);
cout<<actual->dato;
In(actual->derecho);
}
}
void Arbol::Pre(pNodo actual)
{
if(actual!=NULL)
{
cout<<actual->dato;
Pre(actual->izquierdo);
Pre(actual->derecho);
}
}
void Arbol::Post(pNodo actual)
{
if(actual!=NULL)
{
Post(actual->izquierdo);
Post(actual->derecho);
cout<<actual->dato;
}
}
void Arbol::Podar(pNodo &nodo)
{
if(nodo)
{
Podar(nodo->izquierdo);
Podar(nodo->derecho);
delete nodo;
nodo=NULL;
}
}
void Arbol::auxContador (pNodo nodo)
{
contador ++;
if(nodo->izquierdo)
auxContador(nodo->izquierdo);
if(nodo->derecho)
auxContador(nodo->derecho);
}
int Arbol::NumeroNodos()
{
contador=0;
auxContador(raiz);
return contador;
}
void Arbol::auxAltura(pNodo nodo, int a)
{
if(nodo->izquierdo)
auxAltura(nodo->izquierdo, a++);
if(nodo->derecho)
auxAltura(nodo->derecho, a++);
if(EsHoja(nodo)&&a>altura)
altura=a;
}
int Arbol::AlturaArbol ()
{
altura=0;
auxAltura(raiz, 0);
return altura;
}
pNodo Arbol::Buscar(int dat, pNodo actual, int &ban)
{
static pNodo nodo=NULL;
if(!Vacio(actual))
{
if(dat>actual->dato)
Buscar(dat, actual->derecho, ban);
else
if(dat<actual->dato)
Buscar(dat, actual->izquierdo, ban);
else
if(dat==actual->dato)
{
nodo=actual;
ban=1;
}
}
return nodo;
}
void Arbol::Alt(int dat, pNodo actual, int &altura)
{
if(actual)
if(dat!=actual->dato)
{
altura ++;
if(dat>actual->dato)
Alt(dat, actual->derecho, altura);
else
Alt(dat, actual->izquierdo, altura);
}
}
int Arbol::Altura(int dat)
{
int altura=-1;
actual=raiz;
pNodo nodo=Buscar(dat, actual, ban);
//nodo=Buscar(dat, actual, altura);
if(altura==1)
{
altura=0;
Alt(dat, actual, altura);
}
return altura;
}
pNodo Arbol::Padre(pNodo actual, pNodo nodo)
{
static pNodo aux=NULL;
if(actual!=NULL)
{
if(nodo==actual->derecho||nodo==actual->izquierdo)
aux=actual;
else
if(nodo->dato<actual->dato)
Padre(actual->izquierdo, nodo);
else
if(nodo->dato>actual->dato)
Padre(actual->derecho, nodo);
}
return aux;
}
pNodo Arbol::Busdersubizq(pNodo actual)
{
static pNodo nodo=NULL;
if(actual->derecho)
Busdersubizq(actual->derecho);
else
nodo=actual;
return nodo;
}
pNodo Arbol::Busizqsubder (pNodo actual)
{
static pNodo nodo=NULL;
if(actual->izquierdo)
Busizqsubder(actual->izquierdo);
else
nodo=actual;
return nodo;
}
void Arbol::Borrar (int dat)
{
pNodo padre=NULL;
pNodo bnodo, idnodo;
Raiz();
int ban=0;
bnodo=Buscar(dat, actual, ban);
if(ban)
{
if(EsHoja(bnodo))
{
padre=Padre(actual, bnodo);
if(padre->derecho==bnodo)
padre->derecho=NULL;
else
padre->izquierdo=NULL;
delete bnodo;
}
else
if(bnodo->izquierdo)
{
idnodo=Busdersubizq(bnodo->izquierdo);
if(EsHoja(idnodo))
{
padre=Padre(actual, idnodo);
if(padre->derecho==idnodo)
padre->derecho=NULL;
else
padre->izquierdo=NULL;
}
else
bnodo->izquierdo=idnodo->izquierdo;
bnodo->dato=idnodo->dato;
delete idnodo;
}
else
{
idnodo=Busizqsubder(bnodo->derecho);
if(EsHoja(idnodo))
{
padre=Padre(actual, idnodo);
if(padre->izquierdo==idnodo)
padre->izquierdo=NULL;
else
padre->derecho=NULL;
}
else
bnodo->derecho=idnodo->derecho;
bnodo->dato=idnodo->dato;
delete idnodo;
}
}
else
cout<<"El "<<dat<<" no existe";
}
void Mostrar()
{
int d;
cout << d << ",";
}
int main()
{
// Un árbol de enteros
Arbol ArbolInt;
// Inserción de nodos en árbol:
ArbolInt.Insertar(10);
ArbolInt.Insertar(5);
ArbolInt.Insertar(12);
ArbolInt.Insertar(4);
ArbolInt.Insertar(7);
ArbolInt.Insertar(3);
ArbolInt.Insertar(6);
ArbolInt.Insertar(9);
ArbolInt.Insertar(8);
ArbolInt.Insertar(11);
ArbolInt.Insertar(14);
ArbolInt.Insertar(13);
ArbolInt.Insertar(2);
ArbolInt.Insertar(1);
ArbolInt.Insertar(15);
ArbolInt.Insertar(10);
ArbolInt.Insertar(17);
ArbolInt.Insertar(18);
ArbolInt.Insertar(16);
cout << "Altura de arbol " << ArbolInt.AlturaArbol() << endl;
// Mostrar el árbol en tres ordenes distintos:
cout << "InOrden: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
cout << "PreOrden: ";
ArbolInt.PreOrden(Mostrar);
cout << endl;
cout << "PostOrden: ";
ArbolInt.PostOrden(Mostrar);
cout << endl;
// Borraremos algunos elementos:
cout << "N nodos: " << ArbolInt.NumeroNodos() << endl;
ArbolInt.Borrar(5);
cout << "Borrar 5: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(8);
cout << "Borrar 8: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(15);
cout << "Borrar 15: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(4);
cout << "Borrar 4: ";
ArbolInt.InOrden(Mostrar);
ArbolInt.Borrar(17);
cout << endl;
cout << "Borrar 17: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
// Veamos algunos parámetros
cout << "N nodos: " << ArbolInt.NumeroNodos() << endl;
cout << "Altura de 1 " << ArbolInt.Altura(1) << endl;
cout << "Altura de 10 " << ArbolInt.Altura(10) << endl;
cout << "Altura de arbol " << ArbolInt.AlturaArbol() << endl;
cin.get();
return 0;
}
Conoce el reto de esta semana y y gana con Perfil de Windows Live
_________________________________________________________________
Nuevo Windows Live, un mundo lleno de posibilidades. Descúbrelo.
http://www.microsoft.com/windows/windowslive/default.aspx
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090607/53a20f02/attachment.html>
Más información sobre la lista de distribución Cconclase