[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