Está en la página 1de 7

#include<iostream.

h>
#include<conio.h>
#include<math.h>
struct Nodo
{
Nodo *izq;
int dato;
Nodo *der;
}*raiz=NULL, *aux=NULL, *aux1=NULL, *aux2=NULL;

void ingresar();
void mostrarInOrden(Nodo *);
void mostrarPreOrden(Nodo *);
void mostrarPosOrden(Nodo *);
void hojasHijosHermanos();
void recorrer(Nodo *);
void mostrarCamino();
void eliminar();
int balancear(Nodo *, Nodo*);
void rotar(Nodo *,Nodo *,int,int,int);
int altura(Nodo *,int,int);

int hijos, hojas, hermanos;

void main()
{
int op;
do{
clrscr();
cout<<"\tMENU"<<endl;
cout<<"1. Ingresar"<<endl;
cout<<"2. Mostrar Arbol Inorden"<<endl;
cout<<"3. Mostrar Arbol Preorden"<<endl;
cout<<"4. Mostrar Arbol PosORden"<<endl;
cout<<"5. Numero de hojas, hijos y hermanos"<<endl;
cout<<"6. Mostrar camino de partida a llegada"<<endl;
cout<<"7. Eliminar numero"<<endl;
cout<<"8. Equilibrar arbol"<<endl;
cout<<"9. Salir"<<endl;
cout<<"Ingrese una opcion: ";cin>>op;
clrscr();
switch(op)
{
case 1:
ingresar();break;
case 2:
mostrarInOrden(raiz);getch(); break;
case 3:
mostrarPreOrden(raiz);getch();break;
case 4:
mostrarPosOrden(raiz);getch();break;
case 5:
hojasHijosHermanos();getch();break;
case 6:
mostrarCamino();break;
case 7:
eliminar();break;
case 8:
if(raiz==NULL)
cout<<"Arbol vacio!!!";
else
{
balancear(raiz,NULL);
cout<<"***Arbol balanceado***";
}
getch();break;
}
}while(op!=9);
}

void ingresar()
{
aux=new Nodo();
aux->izq=NULL;
aux->der=NULL;
cout<<"Ingrese un numero: ";cin>>aux->dato;
if(raiz==NULL)
raiz=aux;
else
{
aux1=raiz;
do
{
aux2=aux1;
if(aux->dato<=aux1->dato)
aux1=aux1->izq;
else
aux1=aux1->der;
}while(aux1!=NULL);
if(aux->dato<=aux2->dato)
aux2->izq=aux;
else
aux2->der=aux;
}
}

void mostrarInOrden(Nodo *p)


{
if(raiz==NULL)
cout<<"Arbol Vacio!!!";
else
{
if(p!=NULL)
{
mostrarInOrden(p->izq);
cout<<"Elemento: "<<p->dato<<endl;
mostrarInOrden(p->der);
}
}
}

void mostrarPreOrden(Nodo *p)


{
if(raiz==NULL)
cout<<"Arbol Vacio!!!";
else
{
if(p!=NULL)
{
cout<<"Elemento: "<<p->dato<<endl;
mostrarPreOrden(p->izq);
mostrarPreOrden(p->der);
}
}
}

void mostrarPosOrden(Nodo *p)


{
if(raiz==NULL)
cout<<"Arbol Vacio!!!";
else
{
if(p!=NULL)
{
mostrarPosOrden(p->izq);
mostrarPosOrden(p->der);
cout<<"Elemento: "<<p->dato<<endl;
}
}
}
void hojasHijosHermanos()
{
if(raiz==NULL)
cout<<"Arbol Vacio!!!";
else
{
hojas=0, hijos=-1, hermanos=0;
recorrer(raiz);
cout<<"Numero de hermanos: "<<hermanos<<endl;
cout<<"Numero de hijos: "<<hijos<<endl;
cout<<"Numero de hojas: "<<hojas<<endl;
}
}

void recorrer(Nodo *p)


{
if(p!=NULL)
{
hijos++;
if(p->izq==NULL&&p->der==NULL)
hojas++;
else
if(p->izq!=NULL&&p->der!=NULL)
{
hermanos=hermanos+2;
cout<<p->izq->dato<<" y "<<p->der->dato<<" son hermanos"<<endl;
}
recorrer(p->der);
recorrer(p->izq);
}
}

void mostrarCamino()
{
int A, B;
if(raiz==NULL)
cout<<"Arbol Vacio!!!";
else
{
cout<<"Ingrese punto de partida: ";cin>>A;
cout<<"Ingrese punto de llegada: ";cin>>B;
aux=raiz;
aux1=NULL;
while(aux!=NULL&&aux->dato!=A)
if(A<aux->dato)
aux=aux->izq;
else
aux=aux->der;
if(aux==NULL)
cout<<"No existe punto de partida!!!";
else
{
while(aux!=NULL&&aux->dato!=B)
{
cout<<"Elemento: "<<aux->dato<<endl;
if(B<aux->dato)
aux=aux->izq;
else
aux=aux->der;
}
if(aux==NULL)
cout<<"No existe punto de llegada!!!";
else
cout<<"Elemento: "<<aux->dato<<endl;
}
}
getch();
}

void eliminar()
{
int A;
if(raiz==NULL)
cout<<"Arbol vacio!!!";
else
{
cout<<"Ingrese numero a eliminar: ";cin>>A;
aux=raiz;
while(aux!=NULL&&aux->dato!=A)
{
aux1=aux;
if(A<aux->dato)
aux=aux->izq;
else
aux=aux->der;
}
if(aux==NULL)
cout<<"Numero inexistente!!!";
else
{
if(aux==raiz)
{
if(aux->izq==NULL&&aux->der==NULL)
raiz=NULL;
if(aux->izq!=NULL)
{
raiz=aux->izq;
if(aux->der!=NULL)
{
aux1=raiz;
while(aux1->der!=NULL)
aux1=aux1->der;
aux1->der=aux->der;
}
}
else
if(aux->der!=NULL)
raiz=aux->der;

}
else
{
if(aux1->izq==aux)
{
if(aux->izq!=NULL)
{
aux1->izq=aux->izq;
aux2=aux->izq;
while(aux2->der!=NULL)
aux2=aux2->der;
aux2->der=aux->der;
}
else
aux1->izq=aux->der;
}
else
{
if(aux->izq!=NULL)
{
aux1->der=aux->izq;
aux2=aux->izq;
while(aux2->der!=NULL)
aux2=aux2->der;
aux2->der=aux->der;
}
else
aux1->der=aux->der;
}
}
delete(aux);
cout<<"Numero eliminado exitosamente";
}
}
getch();
}

int balancear(Nodo *p, Nodo *padre)


{
int FE, fei, fed;
if(p!=NULL)
{
fei=balancear(p->izq,p);
fed=balancear(p->der,p);
FE=altura(p->izq,-1,-1)-altura(p->der,-1,-1);
if(abs(FE)>1)
rotar(p, padre, FE, fei, fed);
}
return FE;
}

void rotar(Nodo *p, Nodo *padre, int FE, int fei, int fed)
{
if(FE<-1)
{
aux=p->der;
if(FE*fed<0)
{
aux1=aux->izq;
p->der=aux1;
aux->izq=aux1->der;
aux1->der=aux;
aux=aux1;
}
p->der=aux->izq;
aux->izq=p;
if(p==raiz)
raiz=aux;
else
if(padre->izq==p)
padre->izq=aux;
else
padre->der=aux;
}
else
{
aux=p->izq;
if(FE*fei<0)
{
aux1=aux->der;
p->izq=aux1;
aux->der=aux1->izq;
aux1->izq=aux;
aux=aux1;
}
p->izq=aux->der;
aux->der=p;
if(p==raiz)
raiz=aux;
else
if(padre->izq==p)
padre->izq=aux;
else
padre->der=aux;
}
}

int altura(Nodo *q,int c,int a)


{
if(q!=NULL)
{
c++;
a=altura(q->izq,c,a);
a=altura(q->der,c,a);
if(q->izq==NULL&&q->der==NULL&&c>a)
a=c;
}
return a;
}

También podría gustarte