Professional Documents
Culture Documents
INDICE
............................................................................................... 2
................................................................................ 3
................................................................................................. 3
................................... 4
........................................................ 5
............... 6
.................................................. 7
...................................................................................... 8
..................................................................................... 10
............................................................. 12
.................................................................................................... 13
............................................................................. 15
......................... 15
.................................................. 16
................................................................................ 16
...................................................................................................... 17
............................................................................................................ 18
Empezamos declarando las variables que vamos a utilizar (lneas 1 a 4). Las
cadenas las vamos a leer carcter por carcter a travs de ch, para guardar la
pila utilizaremos el arreglo s, y p para saber cul es la posicin del ltimo
elemento en la pila. El entero i lo usaremos en ciclos y n para saber cuntos
casos debemos procesar.
En seguida tenemos el procedimiento push (lneas 6 a 10) y la
funcin pop (lneas 12 a 16), que nos sirven para meter y sacar datos de la pila.
Para guardar un dato, se lo mandamos como parmetro a push, donde
incrementamos la posicin del ltimo elemento y guardamos en esta posicin al
parmetro. Para obtener un dato, llamamos a la funcin pop, en la cual
devolvemos el valor del ltimo dato en la pila y decrementamos la posicin del
ltimo dato. En ningn momento estamos revisando si la pila est llena o vaca,
por lo que debemos tener cuidado al usarla (o agregar dichas verificaciones).
La parte principal del cdigo la tenemos entre las lneas 18 y 41. Empezamos
leyendo la cantidad de casos (lnea 19). Para cada caso, leemos carcter por
carcter hasta llegar al fin de lnea. En la lnea 22 inicializamos el tope de la pila.
Cuando leemos un parntesis que abre, lo agregamos a la pila (lneas 26 y 27).
Si encontramos uno que cierra, sacamos un dato de la pila y revisamos si cierra
correctamente (lneas 28 a 35); en caso de que no lo haga, ponemos la posicin
de la pila a una posicin cualquiera (distinta de cero) y nos salimos. Al final,
revisamos si la cadena es vlida de acuerdo a si la pila termino vaca o no.
A los arboles ordenados de grado dos se les conoce como arboles binarios ya que cada nodo del
rbol no tendr ms de dos descendientes directos. Las aplicaciones de los arboles binarios son
muy variadas ya que se les puede utilizar para representar una estructura en la cual es posible
tomar decisiones con dos opciones en distintos puntos.
La representacin grfica de un rbol binario es la siguiente:
Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas.
Por medio de arreglos.
Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de
estructuras.
Los nodos del rbol binario sern representados como registros que contendrn como mnimo
tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn
para apuntar al subrbol izquierdo y derecho del subrbol en cuestin.
Cada nodo se representa grficamente de la siguiente manera:
Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas.
Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de
estructuras.
Los nodos del rbol binario sern representados como registros que contendrn como
mnimo tres campos. En un campo se almacenar la informacin del nodo.
Los dos restantes se utilizarn para apuntar al subrbol izquierdo y derecho del subrbol
en cuestin.
Hay tres maneras de recorrer un rbol: en inorden, preorden y postorden. Cada una de ellas
tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin:
1. INORDEN
Recorrer el subrbol izquierdo en inorden.
Examinar la raz.
Recorrer el subrbol derecho en inorden.
2. PREORDEN
Examinar la raz.
Recorrer el subrbol izquierdo en preorden.
recorrer el subrbol derecho en preorden.
3. POSTORDEN
Recorrer el subrbol izquierdo en postorden.
Recorrer el subrbol derecho en postorden.
Examinar la raz.
o Inorden: GDBHEIACJKF
o Preorden: ABDGEHICFJK
o Postorden: GDHIEBKJFCA
Existe un tipo especial de rbol binario llamado enhebrado, el cual contiene hebras que pueden
estar a la derecha o a la izquierda. El siguiente ejemplo es un rbol binario enhebrado a la
derecha
ARBOL ENHEBRADO A LA DERECHA. Este tipo de rbol tiene un apuntador a la
derecha que apunta a un nodo antecesor.
Suponga un rbol binario T dispuesto en memoria por representacin enlazada. A veces se aade
al principio de T un nodo extra, especial, llamado nodo cabecera.
Cuando se usa este nodo extra, la variable el rbol, que llamaremos CABEZA (en lugar de raz),
apuntara al nodo de cabecera, y el puntero izquierdo del nodo cabecera apuntara a la raz de T.
Suponga un rbol binario T vaco. T aun contendr al nodo cabecera, pero su puntero izquierdo
contendr el valor nulo. As, la condicin
IZQ [CABEZA]=NULO
7
Salvo que trabajemos con rboles especiales, como los que veremos ms adelante, las
inserciones sern siempre en punteros de nodos hoja o en punteros libres de nodos rama.
Con estas estructuras no es tan fcil generalizar, ya que existen muchas variedades de rboles.
De nuevo tenemos casi el mismo repertorio de operaciones de las que disponamos con las listas:
Aadir o insertar elementos.
Buscar o localizar elementos.
Borrar elementos.
Moverse a travs del rbol.
Recorrer el rbol completo.
Los algoritmos de insercin y borrado dependen en gran medida del tipo de rbol que estemos
implementando, de modo que por ahora los pasaremos por alto y nos centraremos ms en el
modo de recorrer rboles.
Una tarea muy comn a realizar con un rbol es ejecutar una determinada operacin con cada
uno de los elementos del rbol.
Esta operacin se considera entonces como un parmetro de una tarea ms general que es la
visita de todos los nodos o, como se denomina usualmente, del recorrido del rbol.
Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se visitan
en un orden especfico, y pueden considerarse como organizados segn una estructura lineal.
El rbol en montn se usa en un algoritmo de ordenacin llamado ordenacin por montn. Este
algoritmo mejora el tiempo de ejecucin en el peor caso comparado con el mtodo de ordenacin
rpida.
Definicin
Un rbol binario A se dice en montn si:
a) A es completo
b) El valor de cada nodo de A es mayor que los valores de cualquiera de sus hijos.
Insercin en un rbol en montn
Entrada: Lista de elementos.
Salida: rbol en montn.
Mientras existan elementos V en la entrada se proceder de la siguiente forma:
Se adiciona V al final de M de forma que M sigue siendo completo, aunque no
necesariamente sea un rbol en montn.
Si al adicionar V al rbol, no resulta de montn, se hace subir V hasta su lugar
apropiado en M hasta que M sea finalmente de montn.
Insercin en un rbol en montn
El rbol en montn con N elementos est guardado en el vector M. La accin Insercin_Montn
inserta V como un nuevo elemento del rbol. N se incrementa en 1. P da la posicin de V a
medida que sube por el rbol y PAD indica la posicin del padre de V.
Eliminacin de la raz en un rbol en montn
Entrada: rbol en montn M con N elementos
Salida: rbol en montn M con N-1 elementos
V = M (1) raz del rbol M
Procedimiento:
Para eliminar la raz en un rbol en montn M:
Asignamos la raz M(1) a la variable V
Reemplazamos el nodo raz a eliminar con el ltimo nodo que fue adicionado en M, de
modo que M sigue siendo completo, aunque no necesariamente un rbol en montn.
Retomamos, haciendo que la nueva raz se mueva a su lugar adecuado para que M sea
finalmente un rbol en montn.
10
CREACIN DE UN RBOL EN MONTN Se tiene una fila F de enteros. Se quiere construir una
aplicacin para crear un rbol en montn teniendo como entrada la fila F de enteros.
ejecucin de la ordenacin rpida es O(n log n) como la del montn, pero para el peor caso es
proporcional a O (n2).
Un rbol de bsqueda binaria es una estructura apropiada para muchas de las aplicaciones que
se han discutido anteriormente con listas. La ventaja especial de utilizar un rbol es que se facilita
la bsqueda.
Un rbol binario de bsqueda es aquel en el que el hijo de la izquierda (si existe) de cualquier
nodo contiene un valor ms pequeo que el nodo padre, y el hijo de la derecha (si existe) contiene
un valor ms grande que el nodo padre.
Un rbol binario de bsqueda ABB (binary search tree), tambin llamado rbol binario ordenado,
es aquel en el cual sus nodos estn etiquetados con un valor de llave tomado de un conjunto E,
estos elementos pueden ser complejos, pero por simplicidad supondremos que son enteros. En
un rbol de bsqueda se cumple que:
Para todo nodo N:
Todos los valores de los nodos del subrbol izquierdo son menores que el valor de llave
de N.
Todos los valores de los nodos del subrbol derecho son mayores que el valor de la
llave de N.
El rbol binario de bsqueda ABB permite buscar y encontrar un elemento, tambin permite
insertar y borrar elementos fcilmente.
Esta estructura contrasta con los arreglos y las listas:
Arreglo unidimensional: aqu se puede buscar y encontrar fcilmente, pero es costoso
insertar y eliminar, porque se tienen que hacer desplazamientos a la izquierda o a la
derecha del elemento a eliminar o insertar.
Listas enlazadas: aqu se puede insertar y eliminar fcilmente, pero es costoso buscar
y encontrar un elemento, ya que se debe usar una bsqueda secuencial.
La definicin de rbol binario de bsqueda dada asume que todos los valores de los nodos son
distintos. Existe una definicin anloga de rbol binario de bsqueda que permite duplicados,
esto es, en la que cada nodo
N tiene la siguiente propiedad:
12
El valor de N es mayor que cualquier valor del subrbol izquierdo de N y es menor o igual que
cualquier valor del subrbol derecho de N
Implementar una funcin no recursiva para recorrer un rbol binario en inorden. (SOLUCIN)
El cdigo es el siguiente:
/*Fichero: comprobar.c */
#include < pilas.h>
#include < arbolesB.h>
/*---------------------------------------*/
void inordenNR(ArbolB T,void (* EscribirElemento)(void *),int tamano)
{
NodoB nodoActual,aux;
void *et;
Pila p;
int fin;
int faltaHD;
/*Indica si falta el hijo derecho*/
p=CrearPila(sizeof(NodoB));
et=malloc(tamano);
if(!et){
....
/*Error:Sin memoria*/
}
aux=NODOB_NULO;
Push(&aux,p);
nodoActual=RaizB(T);
fin=0;
while(!fin){
while(nodoActual!=NODOB_NULO){
Push(&nodoActual,p);
nodoActual=HijoIzqdaB(nodoActual,T);
}
Tope(&nodoActual,p);
Pop(p);
if (nodoActual!=NODOB_NULO){
EtiquetaArbolB(et,nodoActual,T);
(*EscribirElemento)(et);
13
nodoActual=HijoDrchaB(nodoActual,T);
}
else fin=1;
}
free(et);
DestruirPila(p);
}
14
15
16
17
18