• Viernes 8 de Noviembre de 2024, 23:00

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - monsejaz

Páginas: [1]
1
C/C++ / [Código Fuente] Arbol binario
« en: Sábado 3 de Diciembre de 2005, 19:26 »
//arboles
#include
#include
#include
#include
#include
#include
#include
typedef struct arbol
{
  int dato;
struct arbol *Ramaizq;
struct arbol *Ramader;
}Nodo;

enum{ FALSO=0, VERDADERO };


Nodo *raiz;
Nodo *temp;
Nodo *nuevo;
Nodo *aux;
Nodo *aux2;
Nodo *aux3;
Nodo *elim;
int conta=1;
int con=1,c=0;
int ban,ban2;
int num, mayor;
int hoja=0;
int hijo,B;
int num2;
int bandera=1;
char op,op2;
int cont=0;
int c1,c2,c3,n;

int vacio( struct arbol *hoja );
int busqueda( struct arbol *hoja, int num );
void menu_busquedas();
void Insertar() ;
void Preorden(struct arbol*);
void Inorden(struct arbol*);
void Postorden(struct arbol*);
void Hojas(struct arbol*, int&);
void niveles(struct arbol*, int&);
void padrehijo(struct arbol*,int); // capturas el padre y t dice quienes son sus hijos
void hermano(struct arbol*,int);
struct arbol *borrarx( struct arbol *hoja, int num );
int val;
void main()
{
int op;
do
{
clrscr();
cout<<"1)Insertar"<cout<<"2)Inorden"<cout<<"3)Postorden"<cout<<"4)Preorden"<cout<<"5)Niveles"<cout<<"6)Hojas"<cout<<"7)Busqueda"<cout<<"8)Eliminar"<cout<<"9)Hijos de Padre"<cout<<"10)hermano"<cout<<"11)Salir"<cout<<"Elige una opcion:   "<cin>>op;

if(op==1)
{ Insertar();}

if(op==2)
{ clrscr();
cout<<"Datos:"<Inorden(raiz);
getch();
}
if(op==3)
{ clrscr();
cout<<"Datos:"<Postorden(raiz);
getch(); }

if(op==4)
{ clrscr();
cout<<"Datos:"<Preorden(raiz);
getch(); }

if(op==5)
{ clrscr();
conta=0;
mayor=0;
niveles(raiz, conta);
cout<<"Niveles:     "<getch();}

if(op==6)
{  c=0;
Hojas(raiz,c);
cout<<"Numero de hojas: "<getch();   }

if(op==7)
{ if(vacio(raiz))
{
printf( "\n\nEl Arbol Aun esta Vacio." );
getch();
}else{
menu_busquedas();
}}

if(op==8)
{ cout<<"\n\nNumero: ";
cin>>val;
borrarx(raiz,val);
cout<<"\n.... Borrado ....";  getch();
}
if(op==9)
{ cout<<"\n\n padree Numero: ";
cin>>n;
padrehijo(raiz,n);
getch();
}
if(op==10)
{ cout<<"\n\n hermano Numero: ";
cin>>n;
hermano(raiz,n);
getch();
}

}while(op!=11);
getch();
}

void Insertar()
{
clrscr();
char op2;
do
{
cout<<"Inserta un numero:  "<cin>>num;
if(raiz==NULL)
{
raiz=(arbol *)malloc(sizeof(arbol));
raiz->dato=num;
raiz->Ramaizq=NULL;
raiz->Ramader=NULL;
}
else
{
temp=(arbol*)malloc(sizeof(arbol));
temp=raiz;
ban=0;

while (ban==0)
{
   nuevo=(arbol*)malloc(sizeof(arbol));
nuevo->dato=num;
nuevo->Ramaizq=NULL;
nuevo->Ramader=NULL;
if (temp->dato > nuevo->dato)
{
if(temp->Ramaizq!=NULL)
temp=temp->Ramaizq;
else
{
temp->Ramaizq=nuevo;
ban=1;
}
}
else
{
if(temp->Ramader!=NULL)
temp=temp->Ramader;
else
{
temp->Ramader=nuevo;
ban=1;
}
}
}
}
cout<<"Deseas insertar otro numero: [s/n] "<cin>>op2;
}while(op2!='n');
getch();
}

void Inorden(arbol *nodo)
{
if(nodo !=NULL)
{
Inorden(nodo->Ramaizq);
cout<dato<Inorden(nodo->Ramader);
}
}
void Postorden(arbol *nodo)
{
if(nodo !=NULL)
{
Postorden(nodo->Ramaizq);
Postorden(nodo->Ramader);
cout<dato<}
}
void Preorden(arbol *nodo)
{
if (nodo!=NULL)
{
cout<dato<Preorden(nodo->Ramaizq);
Preorden(nodo->Ramader);
}
}
void Hojas(arbol *nodo, int &c)
{
if (nodo!=NULL)
{

Hojas(nodo->Ramaizq,c);
Hojas(nodo->Ramader,c);
if ((nodo->Ramaizq==NULL) && (nodo->Ramader==NULL))c++;
}

}
void niveles (arbol *nodo, int &conta)
{
if (nodo!=NULL)
{
conta=conta+1;
niveles(nodo->Ramaizq, conta);
niveles(nodo->Ramader,conta);
if ((nodo->Ramaizq==NULL) && (nodo->Ramader==NULL))
if (conta > mayor)
{ mayor=conta;
  conta=0;
}
}
}

int busqueda( struct arbol *hoja, int num )
{
while( hoja )
{
if( num==hoja->dato ) return VERDADERO;
else
{
if( numdato ) hoja= hoja->Ramaizq;
else hoja= hoja->Ramader;
}
}
return FALSO;
}


void menu_busquedas()
{
// int val;

cout<<"\n introduce el Numero a BUscar: ";
cin>>val;
if( busqueda( raiz, val ) )
cout<<"\n\nEncontrado.." ;
else cout<<"\n\nError, No se encuentra." ;
getch();
}

int vacio( struct arbol *hoja )
{
if( !hoja ) return VERDADERO;
return FALSO;
}


struct arbol *borrarx( struct arbol *hoja, int num )
  {
if( hoja->dato==num )
     {
     struct arbol *p, *p2;

     if( vacio( hoja ) )
        {
free( hoja );
        hoja= NULL;
        return hoja;
        }
else if( hoja->Ramaizq==NULL )
        {
p= hoja->Ramader;
        free( hoja );
        return p;
        }
else if( hoja->Ramader==NULL )
        {
p= hoja->Ramaizq;
        free( hoja );
        return p;
        }
     else
        {
p= hoja->Ramader;
p2= hoja->Ramader;
while( p->Ramaizq ) p= p->Ramaizq;
p->Ramaizq= hoja->Ramaizq;
        free( hoja );
        return p2;
        }
     }
  else if( numdato )
hoja->Ramaizq= borrarx( hoja->Ramaizq, num );
  else
hoja->Ramader= borrarx( hoja->Ramader, num );
return hoja;
  }

void padrehijo(arbol *nodo,int n)
{
bandera=1;
while((nodo!=NULL)&&(bandera==1))
{
if( n==nodo->dato)
{ aux=nodo;
aux2=nodo;
aux=aux->Ramader;
aux2=aux2->Ramaizq;
if(nodo->Ramader!=NULL)
{cout<<"\nhijo "<dato;
}
if(nodo->Ramaizq!=NULL)
{cout<<"\nhijo "<dato;
}
bandera=0;}
else
{
if( ndato ) nodo=nodo->Ramaizq;
else nodo=nodo->Ramader;
}
}
}

void hermano(arbol *nodo,int n)
{
bandera=1;
ban2=3;
while((nodo!=NULL)&&(bandera==1))
{
if( n==nodo->dato)
{
if(ban2==0)
{ if(aux3->Ramader!=NULL)
{
aux3=aux3->Ramader;
cout<<"\n hermano "<dato;}
}
if(ban2==1)
{if(aux3->Ramaizq!=NULL)
{
aux3=aux3->Ramaizq;
cout<<"\n hermano "<dato;}
}
bandera=0;}
else
{aux3=nodo;
if( ndato )
{ nodo=nodo->Ramaizq;
ban2=0;
}
else{ nodo=nodo->Ramader;
ban2=1;}
}
}
}



Autor: monse

Páginas: [1]