You are on page 1of 22

Unidad 5: Arboles Binarios Definición: Un Árbol Binario es un conjunto de finito de Elementos, de nombre Nodos de forma que: El Árbol Binario

es Vació si no tiene ningún elemento en el. El Árbol Binario contiene un Nodo Raíz y los dos que parten de él, llamados Nodo Izquierdo y Nodo Derecho. Los Árboles tiene 3 Recorridos Diferentes los cuales son: Pre-Orden In-Orden Post-Orden Pre-Orden Definición: El Recorrido “Pre-Orden” lo recorre de la siguiente manera, viaje a través del Árbol Binario desplegando el Contenido en la Raíz, después viaje a través del Nodo Izquierdo y después a través del Nodo Derecho. Detalle: Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento, de otra manera Desplegara “Árbol Vació…” y terminara el método. Si el Árbol tiene elementos dentro de él, lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar que valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente. Algoritmo:

PreOrd(Arbol, Der, Izq, Pila, Raiz) Temp → Raiz Top → Pila[Top] → Nulo

Si Raiz = Nulo Imprimir “Árbol Vació…” y Salir Repetir mientras Temp ≠ Nulo Imprimir Arbol[Temp] Si Der[Temp] ≠ Nulo Top → Top + 1 Pila[Top] → Der[Temp] Si Izq[Temp] ≠ Nulo Temp → Izq[Temp] Si no: Temp → Pila[Top]; Top → Top - 1 Fin del ciclo Salir

Diagrama:

Corrida: In-Orden Definición: El Recorrido “In-Orden” lo recorre de la siguiente manera. viaje a través del Árbol Binario desplegando el Contenido en el Nodo Izquierdo después la Raíz y finalmente viaja a través del Nodo Derecho. Detalle: .

Si el Árbol tiene elementos dentro de él. de otra manera Desplegara “Árbol Vació…” y terminara el método.1 Mientras Temp ≠ Nulo Imprimir Arbol[Temp] Si Der[Temp] ≠ Nulo Temp → Der[Temp] Ir a Etiqueta . Raiz) Temp → Raiz Top → Pila[Top] → Nulo Si Raiz = Nulo Imprmir “Arbol Vacio…” y Salir Etiqueta: Mientras Temp ≠ Nulo Top → Top + 1 Pila[Top] → Temp Temp → Izq[Temp] Fin del ciclo Temp → Pila[Top] Top → Top . Pila. lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar que valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente. Algoritmo: PreOrd(Arbol. Izq. Der.Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento.

Temp → Pila[Top] Top → Top .1 Fin del ciclo Salir Diagrama: Corrida: .

Raiz) Temp → Raiz Top → Pila[Top] → Nulo Si Raiz = Nulo Imprimir “Arbol Vacio…” y Salir Etiqueta: Mientras Temp ≠ Nulo Top → Top + 1 Pila[Top] → Temp Si Der[Temp] ≠ Nulo Top → Top + 1 Pila[Top] → . viaje a través del Árbol Binario desplegando el Contenido en el Nodo Izquierdo después el Nodo Derecho y finalmente viaja a través de la Raiz. de otra manera Desplegara “Árbol Vació…” y terminara el método. Der.(Der[Temp]) Temp → Izq[Temp] . Algoritmo: PostOrd(Arbol. Detalle: Temp toma el Valor de la Raíz y compara si el Árbol tiene algún Elemento. Pila.In-Orden Definición: El Recorrido “In-Orden” lo recorre de la siguiente manera. Izq. Si el Árbol tiene elementos dentro de él. lo recorrerá y viajara a través de los Arreglos Izq y Der para determinar que valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente.

1 Fin del ciclo Si Temp < 0 Temp = -(Temp) Ir a Etiqueta Salir Diagrama: .Temp → Pila[Top] Top → Top .1 Fin del ciclo Mientras Temp ≥ 0 Imprimir Arbol[Temp] Si Arbol[Temp] = Info[Raiz] Salir Temp → Pila[Top] Top → Top .

Detalle: .Corrida: Búsqueda Definición: La Búsqueda es Similar a todas los Métodos anteriores de Búsqueda. simplemente efectúa un recorrido comparando el Elemento que deseas encontrar contra cada uno de los Elementos en los Arreglos.

Izq. Algoritmo: Busqueda(Arbol. De otra forma la búsqueda es fallida. Pila. si no se encuentra en la Raíz… compara Elemento contra la Raíz para empezar a viajar por el Árbol respectivamente.El Algoritmo de Búsqueda compara el Elemento a buscar con cada uno de los datos de nuestro Árbol. Elem) Si Raiz = Nulo Imprimir “Arbol Vacio” Pos → Nulo Pad → Nulo Regresar Pos y Pad Salir Si Elem = Arbol[Raiz] Imprimir “Elemento Encontrado” Pos → Raiz Pad → Nulo Regresar Pos y Pad Salir Si Elem < Arbol[Raiz] Temp → Izq[Raiz] Temp2 → Raiz Si no: Temp → Der[Raiz] . Raiz. usa un método similar al anterior hasta encontrar el Elemento. Der. compara si el Elemento con el Nodo Raíz.

Temp2 → Raiz Mientras Temp ≠ Nulo Si Elem = Arbol[Temp] Imprimir “Elemento Encontrado…” Pos → Temp Pad → Temp2 Regresar Pos y Pad Salir Si Elem < Arbol[Temp] Temp2 → Temp Temp → Izq[Temp] Si no: Temp2 → Temp Temp → Der[Temp] Fin del ciclo Imprimir “Elemento no Encontrado…” Pos → Nulo Pad → Temp2 Regresar Pos y Pad Salir Diagrama: .

h> #include <iostream.h> class Arbol { .Corrida: Programa click here: ----------------------------------------------------------------------------------------------------------------------------------#include <conio.

} . Izq[i]=i+1.Der[10]. return.0. Pila[i]=0.Izq[10].. Disp=0.0.0.0. Top=0.. for(int i=0. Izq[9]=-999. public: Arbol() { int in[10]={0.0. } Top=0.Disp. int Info[10].0}.i<10.private: int Top. } void PreOrd(void) { int Temp=Raiz.0.i++) { Info[i]=0.Raiz.0. if(Raiz==-999) { cout<<"Arbol Vacio.Pila[10]."<<endl.0. Pila[0]=-999. Der[i]=-999. Raiz=-999.

} if(Izq[Temp]!=-999) { Temp=Izq[Temp].. . Top=0. if(Raiz==-999) { cout<<"Arbol Vacio. Pila[0]=-999. Top--. Pila[Top]=Der[Temp]. if(Der[Temp]!=-999) { Top++."<<endl. } } } void InOrd(void) { int Temp=Raiz. } else { Temp=Pila[Top]. return.while(Temp!=-999) { cout<<Info[Temp]<<endl..

Pila[Top]=Temp. Top=0. } Temp=Pila[Top]. goto Back. } } void PostOrd(void) { int Temp=Raiz. if(Der[Temp]!=-999) { Temp=Der[Temp]. Top--. Temp=Izq[Temp]. while(Temp!=-999) { cout<<Info[Temp]<<endl. Top--. if(Raiz==-999) { . } Temp=Pila[Top].} Back: while(Temp!=-999) { Top++. Pila[0]=-999.

. while(Temp>=0) { cout<<Info[Temp]<<endl. Pila[Top]=-Der[Temp]. } Back1: while(Temp!=-999) { Top++. } if(Temp<0) { Temp=-Temp. if(Der[Temp]!=-999) { Top++. Top--. Temp=Pila[Top].. } Temp=Izq[Temp]. Top--."<<endl. return. Pila[Top]=Temp. } Temp=Pila[Top]..cout<<"Arbol Vacio. if(Info[Temp]==Info[Raiz]) return.

} if(Elem==Info[Raiz]) { PosPad[0]=Raiz.Temp2..int Elem) { int Temp. . } } void Busqueda(int PosPad[2]."<<endl. PosPad[1]=-999. return.."<<endl. return...goto Back1. Temp2=Raiz. } if(Elem<Info[Raiz]) { Temp=Izq[Raiz]. PosPad[1]=-999. if(Raiz==-999) { PosPad[0]=-999. cout<<"Arbol Vacio. Temp2=Raiz. } else { Temp=Der[Raiz]. cout<<"Elemento Encontrado.

} void InsOrd(int Elem) { int PosPad[2].. PosPad[1]=Temp2. .Temp. return...} while(Temp!=-999) { if(Elem==Info[Temp]) { cout<<"Elemento Encontrado. PosPad[1]=Temp2."<<endl. } if(Elem<Info[Temp]) { Temp2=Temp. Temp=Der[Temp]."<<endl. cout<<"Elemento no Encontrado. Temp=Izq[Temp]. PosPad[0]=Temp.. } else { Temp2=Temp. } } PosPad[0]=-999.

Disp=Izq[Disp]. Der[Temp]=-999. Imposible Insertar. if(PosPad[0]!=-999) { cout<<"Elemento Existente.. Imposible Insertar."<<endl. .. return. PosPad[0]=Temp.. } Temp=Disp. } cout<<"Arbol Lleno.. Info[Temp]=Elem.Elem).."<<endl. else if(Elem<Info[PosPad[1]]) Izq[PosPad[1]]=Temp.. clrscr(). } void Eliminar(int Elem) { int PosPad[2].if(Disp!=-999) { Busqueda(PosPad... if(PosPad[1]==-999) Raiz=Temp.. return. Izq[Temp]=-999."<<endl. cout<<"Elemento Insertado. else Der[PosPad[1]]=Temp..

"<<endl. else . } if(Der[PosPad[0]]!=-999&&Izq[PosPad[0]]!=-999) CasoB(PosPad)..Elem)..Busqueda(PosPad. Disp=PosPad[0]. else if(Izq[PosPad[0]]!=-999) Temp=Izq[PosPad[0]]. clrscr(). Imposible Eliminar.. } void CasoA(int PosPad[2]) { int Temp. return. if(PosPad[1]!=-999) { if(PosPad[0]==Izq[PosPad[1]]) Izq[PosPad[1]]=Temp.. else Temp=Der[PosPad[0]]. else CasoA(PosPad). Izq[PosPad[0]]=Disp. if(Izq[PosPad[0]]==-999&&Der[PosPad[0]]==-999) Temp=-999. if(PosPad[0]==-999) { cout<<"El Elemento no se Encuentra en el Arbol.

} void CasoB(int PosPad[2]) { int PosPad2[2].Temp=Der[PosPad[0]]. } else Raiz=Temp. Temp=Izq[Temp]. else Der[PosPad[1]]=PosPad2[0].Temp2=PosPad[0]. while(Izq[Temp]!=-999) { Temp2=Temp. CasoA(PosPad2). PosPad2[1]=Temp2. } PosPad2[0]=Temp. if(PosPad[1]!=-999) { if(PosPad[0]==Izq[PosPad[1]]) Izq[PosPad[1]]=PosPad2[0]. Der[PosPad2[0]]=Der[PosPad[0]].Der[PosPad[1]]=Temp. } . } else Raiz=PosPad2[0]. Izq[PosPad2[0]]=Izq[PosPad[0]].

.op=0. break. break.10). gotoxy(1. cout<<"\n1) Pre-Orden\n2) In-Orden\n3) Post-Orden\n4) Busqueda\n5) Insercion\n6) Eliminar\n7) Salir"<<endl.PostOrd(). case 4: cout<<"Que Numero deseas buscar?"<<endl. cin>>op. switch (op) { case 1: tec.1).PreOrd(). cin>>res. gotoxy(1. break.res.res).}tec. case 2: tec. main() { int PosPad[2]. tec.Busqueda(PosPad. case 3: tec. while(op!=7) { clrscr(). break. cout<<"Que deseas hacer?: ".InOrd().

. } getch(). case 6: cout<<"Que Numero quieres Eliminar?"<<endl. break.". cin>>res. case 7: cout<<"Salida.case 5: cout<<"Que Numero quieres Insertar?"<<endl. break..InsOrd(res). break. break. default: cout<<"Opcion Erronea"<<endl.Eliminar(res). tec. tec. } } . cin>>res.