Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prog9 Arbol
Prog9 Arbol
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);
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 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();
}
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;
}
}