ARBOLES BINARIOS:
Recorrido en preorden:
En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierda, nodo derecha.
En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
Recorrido en postorden:
En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda, nodo derecha, nodo raiz. En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.
Recorrido en inorden:
En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 4, 9.
Esquema de implementación:
EJERCICIO:
El recorrido en preorden de un determinado árbol binario es: GEAIBMCLDFKJH y en inorden IABEGLDCFMKHJ .
A)Dibujar el árbol binario. B)Dar el recorrido enstorden.
C)Diseñar una función para dar el recorrido en postorden dado el recorrido en preorden e inorden y escribir un programa para comprobar el resultado del apartado anterior.
Las soluciones son las siguientes:
A) El árbol correspondiente es el de la siguiente figura:
B)El recorrido en postorden es IBAEDLFCHJKMG.
C)El código solución al tercer apartado es el siguiente:
/*Fichero: comprobar.c */
#include < stdio.h>
#include < stdlib.h>
#include < string.h>
char *preorden="GEAIBMCLDFKJH";
char *inorden="IABEGLDCFMKHJ";
char *postorden;
/*---------------------------------------*/
void post(char *pre,char *in,char *pos,int n)
{
int longIzqda;
if(n!=0){
pos[n-1]=pre[0];
longIzqda=strchr(in,pre[0])-in;
post (pre+1,in,pos,longIzqda);
post (pre+1+longIzqda,in+1+longIzqda,pos+longIzqda,n-1-longIzqda);
}
}
/*----------------------------------------*/
int main(int argc,char *argv[])
{
int aux;
aux=strlen(preorden);
postorden=(char *)malloc(aux*sizeof(char));
if (postorden){
printf("El preorden es: %s\n",preorden);
printf("El inorden es: %s\n",inorden);
post(preorden,inorden,postorden,aux);
postorden[aux]='\0';
printf("El postorden calculado es: %s\n",postorden);
free(postorden);
}
else{
fprintf(stderr,"Error: Sin memoria\n");
return 1;
}
return 0;
}

PLAN DE VUELO:
El plan de vuelo (flight plan) es el informe donde se indican todos los datos referentes a un vuelo. En éste, además de información técnica añadida por el piloto debe constar el lugar de salida, destino, altitud, velocidad de crucero, y todos los puntos por donde pasará la aeronave.
Estos puntos suelen ser estaciones VOR e intersecciones que ya están establecidas por la OACI (Organización de Aviación Civil Internacional) y que a su vez conforman las rutas aéreas. También se suelen incluir datos referentes a la aeronave como, carga de combustible, nombre del comandante, hora y fecha (ZULU). El plan de vuelo puede ser visual (VFR) o instrumental (IFR). En el caso de vuelo VFR se incluirán los puntos por donde pasará la aeronave, en el caso de vuelo IFR se deberán indicar puntos de salida y aproximación instrumental que ya están establecidos como estándares; Así como también las aerovías y puntos de reporte obligatorios. También en un plan de vuelo, se especifica:
- La altitud o nivel de vuelo a volar.
- El equipo de navegación que se cuenta abordo de la aeronave y el tipo de transpondedor.
- El equipo de salvamento que se encuentra abordo.
- La identificación o matrícula de la aeronave.
- Tipo de vuelo (Aviación General, Militar, Vuelo con Itinerario (Scheduled), Vuelo sin Itinerario (Non-Scheduled).
- Número de tripulantes (Y nombres).
- Categoría de la estela turbulenta (Ligera, Media, Pesada)
- Velocidad de crucero.
- Tiempo estimado en ruta (EET).
- El (Los) Aeropuerto(s) Alterno(s)
- Existe un compartimento llamado "OTROS DATOS" que sirve para señalar el nombre de los pasajeros; quién es el operador de la aeronave; si existiese un instructor abordo, se escribiría su nombre y número de licencia, al igual que el nombre de la escuela; si se cuenta con algún tipo de sistema especial abordo (ej. RMK/TCAS Onboard: Lo que significa que tiene el Sistema de Alerta de Colisión de Tráfico); entre otros.
- La autonomía de la aeronave (El combustible abordo expresado en HORAS).
- Personas (además de los tripulantes) abordo.
- Color y marcas de la aeronave.
- Observaciones.
- Nombre del piloto al mando, del primer oficial y sus números de licencia.
- El domicilio de los pilotos (o base de vuelo).
- Firma del piloto al mando.
- Firma del comandante del aeropuerto. si son vuelos internacionales los pilotos deben de hablar el idioma de ruta para poder comunicarce con los pasajeros y las aeromozas deben de dar una pequeña instruccion de como mantener la calma en caso de una turbulencia.
METODOS DE BUSQUEDA:
Busqueda Secuencial:
Definicion:
La búsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La búsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o termina sin éxito, cuando se determina que no aparece ningún registro con esa llave.
Búsqueda secuencial, también se le conoce como búsqueda lineal. Supongamos una colección de registros organizados como una lista lineal. El algoritmo básico de búsqueda secuencial consiste en empezar al inicio de la lista e ir a través de cada registro hasta encontrar la llave indicada (k), o hasta al final de la lista.
ORDENACION INTERNA:
Selección: Este método consiste en buscar el elemento más pequeño del array y ponerlo en primera posición; luego, entre los restantes, se busca el elemento más pequeño y se coloca en segudo lugar, y así sucesivamente hasta colocar el último elemento. Por ejemplo, si tenemos el array {40,21,4,9,10,35}, los pasos a seguir son:
{4,21,40,9,10,35} <-- Se coloca el 4, el más pequeño, en primera posición : se cambia el 4 por el 40. {4,9,40,21,10,35} <-- Se coloca el 9, en segunda posición: se cambia el 9 por el 21. {4,9,10,21,40,35} <-- Se coloca el 10, en tercera posición: se cambia el 10 por el 40. {4,9,10,21,40,35} <-- Se coloca el 21, en tercera posición: ya está colocado. {4,9,10,21,35,40} <-- Se coloca el 35, en tercera posición: se cambia el 35 por el 40. Si el array tiene N elementos, el número de comprobaciones que hay que hacer es de N*(N-1)/2. private static void permuta (int[] V, int i, int j) { int t; t= V[i]; V[i]= V[j]; V[j]= t; } // Ordenacion por seleccion public static void seleccion (int[] V) { int L= V.length; int menor,i,j; for (i= 0; i < L-1; i++) { for (j= i+1,menor=i; j < L; j++) if (V[j] < V[menor]) menor= j; // el mas pequeño permuta (V, i, menor); } }
Burbuja: Consiste en comparar pares de elementos adyacentes e intercambiarlos entre sí hasta que estén todos ordenados. Con el array anterior, {40,21,4,9,10,35}:
Primera pasada: {21,40,4,9,10,35} <-- Se cambia el 21 por el 40. {21,4,40,9,10,35} <-- Se cambia el 40 por el 4. {21,4,9,40,10,35} <-- Se cambia el 9 por el 40. {21,4,9,10,40,35} <-- Se cambia el 40 por el 10. {21,4,9,10,35,40} <-- Se cambia el 35 por el 40. Segunda pasada: {4,21,9,10,35,40} <-- Se cambia el 21 por el 4. {4,9,21,10,35,40} <-- Se cambia el 9 por el 21. {4,9,10,21,35,40} <-- Se cambia el 21 por el 10. Ya están ordenados, pero para comprobarlo habría que acabar esta segunda comprobación y hacer una tercera. Si el array tiene N elementos, para estar seguro de que el array está ordenado, hay que hacer N-1 pasadas, por lo que habría que hacer (N-1)*(N-i-1) comparaciones. //metodo de la burbuja public static void burbuja (int[] V) { int L= V.length; boolean cambios; for (int i= 0; i < L-1; i++) { cambios= false; for (int j= L-1; j > i; j--) { if (V[j-1] > V[j]) { permuta (V, j-1, j); cambios= true; } } if (! cambios) break; } }
Inserción directa: En este método lo que se hace es tener una sublista ordenada de elementos del array e ir insertando el resto en el lugar adecuado para que la sublista no pierda el orden. Para el ejemplo {40,21,4,9,10,35}, se tiene: {40,21,4,9,10,35} <-- La primera sublista ordenada es {40}. Insertamos el 21: {40,40,4,9,10,35} <-- aux=21; {21,40,4,9,10,35} <-- Ahora la sublista ordenada es {21,40}.
Insertamos el 4: {21,40,40,9,10,35} <-- aux=4; {21,21,40,9,10,35} <-- aux=4; {4,21,40,9,10,35} <-- Ahora la sublista ordenada es {4,21,40}. Insertamos el 9: {4,21,40,40,10,35} <-- aux=9; {4,21,21,40,10,35} <-- aux=9; {4,9,21,40,10,35} <-- Ahora la sublista ordenada es {4,9,21,40}. Insertamos el 10: {4,9,21,40,40,35} <-- aux=10; {4,9,21,21,40,35} <-- aux=10; {4,9,10,21,40,35} <-- Ahora la sublista ordenada es {4,9,10,21,40}. Y por último insertamos el 35: {4,9,10,21,40,40} <-- aux=35; {4,9,10,21,35,40} <-- El array está ordenado. En el peor de los casos, el número de comparaciones que hay que realizar es de N*(N-1)/2. public static void inserccion(int[] V) { int L= V.length; int j, aux; for (int i= 0; i < L-1; i++) { j= i+1; aux= V[j]; while (j > 0 && aux < V[j-1]) { V[j]= V[j-1]; j--; } V[j]= aux; } } Inserción binaria: Es el mismo método que la inserción directa, excepto que la búsqueda del orden de un elemento en la sublista ordenada se realiza mediante una búsqueda binaria, lo que supone un ahorro de tiempo .
Shell: Es una mejora del método de inserción directa, utilizado cuando el array tiene un gran número de elementos. En este método no se compara a cada elemento con el de su izquierda, como en el de inserción, sino con el que está a un cierto número de lugares (llamado salto) a su izquierda. Este salto es constante, y su valor inicial es N/2 (siendo N el número de elementos, y siendo división entera). Se van dando pasadas hasta que en una pasada no se intercambie ningún elemento de sitio. Entonces el salto se reduce a la mitad, y se vuelven a dar pasadas hasta que no se intercambie ningún elemento, y así sucesivamente hasta que el salto vale 1.
Por ejemplo, lo pasos para ordenar el array {40,21,4,9,10,35} mediante el método de Shell serían: Salto=3: Primera pasada: {9,21,4,40,10,35} <-- se intercambian el 40 y el 9. {9,10,4,40,21,35} <-- se intercambian el 21 y el 10. Salto=1: Primera pasada: {9,4,10,40,21,35} <-- se intercambian el 10 y el 4. {9,4,10,21,40,35} <-- se intercambian el 40 y el 21. {9,4,10,21,35,40} <-- se intercambian el 35 y el 40. Segunda pasada: {4,9,10,21,35,40} <-- se intercambian el 4 y el 9. Con sólo 6 intercambios se ha ordenado el array, cuando por inserción se necesitaban muchos más.
Ordenación rápida (quicksort): Este método se basa en la táctica "divide y vencerás", que consiste en ir subdividiendo el array en arrays más pequeños, y ordenar éstos. Para hacer esta división, se toma un valor del array como pivote, y se mueven todos los elementos menores que este pivote a su izquierda, y los mayores a su derecha. A continuación se aplica el mismo método a cada una de las dos partes en las que queda dividido el array.

FOTO DEL ARBOL GENEALOGICO: