diapositiva de l estructura de datos
TRANSCRIPT
![Page 1: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/1.jpg)
Universidad Técnica de Manabí
Escuela de ingeniería en sistemas
![Page 2: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/2.jpg)
INTEGRANTES
*Juliana Marcillo *María Zambrano
![Page 3: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/3.jpg)
TEMAS Listas Abiertas Listas cerradasPilas Colas Memoria EstáticaMemoria DinámicaArboles Nodos –hijo-padreRaíz-hoja -Rama
![Page 4: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/4.jpg)
Orden- Grado Nivel- Altura Declaración de TipoTipo de Recorrido pre orden In orden Post orden
![Page 5: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/5.jpg)
Operaciones Básicas Sobre Árbol Binario de BúsquedaArboles Equilibrados AVLBalance de Árbol
![Page 6: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/6.jpg)
LISTAS ABIERTAS
La forma más simple de estructura dinámica es la lista abierta. En esta forma los nodos se organizan de modo que cada uno apunta al siguiente, y el último no apunta a nada, es decir, el puntero del nodo siguiente vale NULL.En las listas abiertas existe un nodo especial: el primero. Normalmente diremos que nuestra lista es un puntero a ese primer nodo y llamaremos a ese nodo la cabeza de la lista. Eso es porque mediante ese único puntero podemos acceder a toda la lista.
![Page 7: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/7.jpg)
OPERACIONES BÁSICAS CON LISTAS
Con las listas tendremos un pequeño repertorio de operaciones básicas que se pueden realizar:
Añadir o insertar elementos. Buscar o localizar elementos. Borrar elementos. Moverse a través de una lista, anterior, siguiente, primero.
Cada una de estas operaciones tendrá varios casos especiales, por ejemplo, no será lo mismo insertar un nodo en una lista vacía, o al principio de una lista no vacía, o la final, o en una posición intermedia.
![Page 8: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/8.jpg)
INSERTAR ELEMENTOS EN UNA LISTA ABIERTA
Insertar un elemento en una lista vacía.Este es, evidentemente, el caso más sencillo. Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a él, además el puntero a la lista valdrá NULL:
Lista vacía
El proceso es muy simple, bastará con que: 1.- nodo->siguiente apunte a NULL 2.- Lista apunte a nodo.
![Page 9: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/9.jpg)
INSERTAR UN ELEMENTO EN LA PRIMERA POSICIÓN DE UNA LISTA.
Insertar al principio
Podemos considerar el caso anterior como un caso particular de éste, la única diferencia es que en el caso anterior la lista es una lista vacía, pero siempre podemos, y debemos considerar una lista vacía como una lista.
![Page 10: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/10.jpg)
De nuevo partiremos de un nodo a insertar, con un puntero que apunte a él, y de una lista, en este caso no vacía:
Insertado al principio
El proceso sigue siendo muy sencillo:1.- Hacemos que nodo->siguiente apunte a Lista. 2.- Hacemos que Lista apunte a nodo.
![Page 11: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/11.jpg)
INSERTAR UN ELEMENTO EN LA ÚLTIMA POSICIÓN DE UNA LISTA
Este es otro caso especial. Para este caso partiremos de una lista no vacía:
Insertar al final
![Page 12: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/12.jpg)
El proceso en este caso tampoco es excesivamente complicado:1.- Necesitamos un puntero que señale al último elemento de la lista.La manera de conseguirlo es empezar por el primero y avanzar hasta que el nodo que tenga como siguiente el valor NULL. 2.- Hacer que nodo->siguiente sea NULL. 3.- Hacer que ultimo->siguiente sea nodo
Insertado al final
![Page 13: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/13.jpg)
El proceso a seguir será:1.- Hacer que nodo->siguiente señale a anterior->siguiente. 2.- Hacer que anterior->siguiente señale a nodo.
Insertado al final
![Page 14: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/14.jpg)
ELIMINAR ELEMENTOS EN UNA LISTA ABIERTA
Eliminar el primer nodo de una lista abierta
Eliminar primer nodo
Es el caso más simple. Partiremos de una lista con uno o más nodos, y usaremos un puntero auxiliar, nodo:1.-Hacemos que nodo apunte al primer elemento de la lista, es decir a Lista. 2.-Asignamos a Lista la dirección del segundo nodo de la lista: Lista->siguiente. 3.-Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
![Page 15: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/15.jpg)
Primer nodo eliminado
Si la lista sólo tiene un nodo, el proceso es también válido, ya que el valor de Lista->siguiente es NULL, y después de eliminar el primer nodo la lista quedará vacía, y el valor de Lista será NULL.De hecho, el proceso que se suele usar para borrar listas completas es eliminar el primer nodo hasta que la lista esté vacía.
![Page 16: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/16.jpg)
ELIMINAR UN NODO CUALQUIERA DE UNA LISTA ABIERTA
En todos los demás casos, eliminar un nodo se puede hacer siempre del mismo modo.Supongamos que tenemos una lista con al menos dos elementos, y un puntero al nodo anterior al que queremos eliminar.
Eliminar un nodo
![Page 17: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/17.jpg)
El proceso es parecido al del caso anterior:1.-Hacemos que nodo apunte al nodo que queremos borrar. 2.-Ahora, asignamos como nodo siguiente del nodo anterior, el siguiente al que queremos eliminar: anterior->siguiente = nodo->siguiente. 3.-Eliminamos la memoria asociada al nodo que queremos eliminar.
Nodo eliminado
![Page 18: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/18.jpg)
LISTAS CIRCULAR
Una lista circular es una lista lineal en la que el último nodo a punta al primero.Las listas circulares evitan excepciones en la operaciones que se realicen sobre ellas. No existen casos especiales, cada nodo siempre tiene uno anterior y uno siguiente.En algunas listas circulares se añade un nodo especial de cabecera, de ese modo se evita la única excepción posible, la de que la lista esté vacía.
![Page 19: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/19.jpg)
LISTAS ENLAZADAS.
La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada, al igual que los vectores
pero, a diferencia de estos, esta estructura es dinámica, por lo que no tenemos que saber "a priori" los elementos que
puede contener. En una lista enlazada, cada elemento apunta al siguiente
excepto el último que no tiene sucesor y el valor del enlace es null.
![Page 20: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/20.jpg)
DECLARACIONES DE TIPOS PARA MANEJAR LISTAS
CIRCULARES EN CLos tipos que definiremos normalmente para manejar listas cerradas son los mismos que para para manejar listas abiertas:typedef struct _nodo { int dato; struct _nodo *siguiente;} tipo Nodo; typedef tipo Nodo *pNodo;typedef tipoNodo *Lista;tipoNodo es el tipo para declarar nodos, evidentemente.pNodo es el tipo para declarar punteros a un nodo.
![Page 21: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/21.jpg)
ESQUEMA DE UN NODO Y UNA LISTA ENLAZADA.
![Page 22: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/22.jpg)
LOS OPERADORES BÁSICOS DE UNA LISTA ENLAZADA SON:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al principio o final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.
![Page 23: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/23.jpg)
OPERADORES DE INSERCIÓN EN LISTAS ENLAZADAS.
Las funciones de inserción al principio de la lista,g_slist_prepend, y al final,g_slist_append, son sencillas de usar. Sólo hay que pasarles como parámetros la lista donde queremos añadir el dato así como el dato a insertar y la función devuelve una lista con el nuevo dato insertado.
La función g_slist_insert inserta el dato en la posición indicada.
![Page 24: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/24.jpg)
OPERADORES DE ELIMINACIÓN EN LISTAS ENLAZADAS.
Las dos funciones expuestas para la eliminación de nodos, si bien tienen una definición prácticamente idéntica, el resultado obtenido es distinto. En el caso de g_slist_remove, se eliminará el nodo que contenga el valor data. Si hay varios nodos con el mismo valor, sólo se eliminará el primero. Si ningún nodo contiene ese valor, no se realiza ningún cambio en el GSList. En el caso de g_slist_remove_all, se
eliminan todos los nodos de la lista que contengan el valor data y nos devuelve la nueva lista resultante de la eliminación de los nodos.
![Page 25: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/25.jpg)
PILAS.Una pila es un tipo especial de lista abierta en la que sólo se pueden
insertar y eliminar nodos en uno de los extremos de la lista. Estas operaciones se conocen como "push" y "pop", respectivamente "empujar" y "tirar". Además, las escrituras de datos siempre son
inserciones de nodos, y las lecturas siempre eliminan el nodo leído.
PILA
![Page 26: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/26.jpg)
PUSH EN UNA PILA VACÍA
Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a él, además el puntero a la pila valdrá NULL:
Push en vacíaEl proceso es muy simple, bastará con que:1.- nodo->siguiente apunte a NULL. 2.- Pila apunte a nodo.
![Page 27: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/27.jpg)
PUSH EN UNA PILA NO VACÍA
Push en pila no vacíaPodemos considerar el caso anterior como un caso particular de éste, la única diferencia es que podemos y debemos trabajar con una pila vacía como con una pila normal.De nuevo partiremos de un nodo a insertar, con un puntero que apunte a él, y de una pila, en este caso no vacía:
ResultadoEl proceso sigue siendo muy sencillo:1.-Hacemos que nodo->siguiente apunte a Pila. 2.-Hacemos que Pila apunte a nodo.
![Page 29: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/29.jpg)
POP, LEER Y ELIMINAR UN ELEMENTOPopAhora sólo existe un caso posible, ya que sólo podemos leer desde un extremo de la pila.Partiremos de una pila con uno o más nodos, y usaremos un puntero auxiliar, nodo:
ResultadoHacemos que nodo apunte al primer elemento de la pila, es decir a Pila. Asignamos a Pila la dirección del segundo nodo de la pila: Pila->siguiente. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operación pop equivale a leer y borrar. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Resultado
![Page 30: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/30.jpg)
COLAS
Una cola es un tipo especial de lista abierta en la que sólo se pueden insertar nodos en uno de los extremos de la lista y sólo se pueden eliminar nodos en el otro. Además, como sucede con las pilas, las escrituras de datos siempre son inserciones de nodos, y las lecturas
siempre eliminan el nodo leído.
![Page 31: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/31.jpg)
MEMORIA ESTÁTICA• Definición: Colección finita, homogénea y ordenada de
elementos. Finita: Porque todo arreglo tiene un límite. Homogénea: Porque todos los elementos son del mismo tipo. Ordenada: Porque se puede determinar cuál es el enésimo elemento.
• Un arreglo tiene dos partes: Componentes e índices
C1 C2 .... Cn
i0 i1 in
Componentes
Ííndices
Componentes: Hacen referencia a los elementos que forman el arreglo. Ííndices: Permiten referirse a los componentes del arreglo en forma individual.
![Page 32: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/32.jpg)
MEMORIA DINÁMICA
• Las variables contienen valores específicos, las variables apuntador contienen direcciones de memoria de otras variables.
2
cont29DC
ptrcont La variable “ptrcont” contiene
la dirección de memoria de la variable “cont”
Las variables apuntador estan asociadas a un tipo de dato. Por ej. Si el valor de cont es entero la variable apuntador ptrcont debe ser de tipo entero.
![Page 34: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/34.jpg)
DEFINICIÓN
Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.También se suele dar una definición recursiva: un árbol es una estructura en compuesta por un dato y varios árboles.Esto son definiciones simples. Pero las características que implican no lo son tanto.
![Page 36: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/36.jpg)
NODOS
Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En el ejemplo, 'L' y 'M' son hijos de 'G'. Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo 'A' es padre de 'B', 'C' y 'D'. Los árboles con los que trabajaremos tienen otra característica importante: cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.
![Page 37: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/37.jpg)
Los árboles con los que trabajaremos tienen otra característica importante: cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.En cuanto a la posición dentro del árbol:Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al árbol. En el ejemplo, ese nodo es el 'A'. Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M', 'N' y 'O'. Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no pertenecen a ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.
![Page 38: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/38.jpg)
Existen otros conceptos que definen las características del árbol, en relación a su
tamañoOrden: es el número potencial de hijos que puede tener cada elemento de árbol. De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede apuntar a tres será de orden tres, etc. Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En el árbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no existen elementos con más de tres hijos. Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3. Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.
![Page 39: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/39.jpg)
DECLARACIÓN DEL TIPO DE DATO
Iremos ya declarando el tipo de dato que representará un árbol AVL. Esto nos ayudará a formalizar las cosas y nos permitirá en el correr de este documento ir definiendo las operaciones sobre el tipo de dato abstracto. El lenguaje a utilizar será C. Fue elegido tan sólo por gustos personales del autor de este documento. Sin embargo se tratará de usar sólo aquellas características de C que puedan ser fácilmente implementadas en la mayoría de los lenguajes estructurados como Pascal, Modula-2, etc.
![Page 40: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/40.jpg)
Los árboles de orden dos son bastante especiales, de hecho les dedicaremos varios capítulos. Estos árboles se conocen también como árboles binarios.Frecuentemente, aunque tampoco es estrictamente necesario, para hacer más fácil moverse a través del árbol, añadiremos un puntero a cada nodo que apunte al nodo padre. De este modo podremos avanzar en dirección a la raíz, y no sólo hacia las hojas
![Page 41: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/41.jpg)
Al igual que hicimos con las listas que hemos visto hasta ahora, declaramos un tipo tipoNodo para declarar nodos, y un tipo pNodo para es el tipo para declarar punteros a un nodo.Árbol es el tipo para declarar árboles de orden ORDEN.
![Page 43: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/43.jpg)
El movimiento a través de árboles, salvo que implementemos punteros al nodo padre, será siempre partiendo del nodo raíz hacia un nodo hoja. Cada vez que lleguemos a un nuevo nodo podremos optar por cualquiera de los nodos a los que apunta para avanzar al siguiente nodo.
![Page 44: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/44.jpg)
TIPO DE RECORRIDOEl modo evidente de moverse a través de las ramas de un árbol es siguiendo los punteros, del mismo modo en que nos movíamos a través de las listas.Esos recorridos dependen en gran medida del tipo y propósito del árbol, pero hay ciertos recorridos que usaremos frecuentemente. Se trata de aquellos recorridos que incluyen todo el árbol.Hay tres formas de recorrer un árbol completo, y las tres se suelen implementar mediante recursividad. En los tres casos se sigue siempre a partir de cada nodo todas las ramas una por una.Supongamos que tenemos un árbol de orden tres, y queremos recorrerlo por completo.Partiremos del nodo raíz:
![Page 45: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/45.jpg)
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 método seria seguir el orden: nodo raíz, nodo izquierda, nodo derecha
![Page 46: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/46.jpg)
Recorrido pre orden-Raíz-Sub árbol izquierdo-Sub árbol derecho
![Page 47: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/47.jpg)
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 método seria seguir el orden: nodo izquierda, nodo derecha, nodo raíz
![Page 48: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/48.jpg)
recorrido inorden-Sub árbol izquierdo-Raíz-Sub árbol derecho
![Page 49: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/49.jpg)
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 método seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha
![Page 50: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/50.jpg)
Recorrido postorden-Sub árbol izquierdo-Sub árbol derecho-Raíz
![Page 52: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/52.jpg)
Un árbol binario de búsqueda es un tipo particular de árbol binario que presenta una estructura de datos en forma de árbol usada en informática.
![Page 53: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/53.jpg)
DESCRIPCION
Un árbol binario de búsqueda (ABB) es un árbol binario definido de la siguiente forma:Todo árbol vacío es un árbol binario de búsqueda.
![Page 54: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/54.jpg)
Un árbol binario no vacío, de raíz R, es un árbol binario de búsqueda si:• En caso de tener subárbol izquierdo, la raíz R debe ser mayor que el valor máximo almacenado en el subárbol izquierdo, y que el subárbol izquierdo sea un árbol binario de búsqueda.• En caso de tener subárbol derecho, la raíz R debe ser menor que el valor mínimo almacenado en el subárbol derecho, y que el subárbol derecho sea un árbol binario de búsqueda.
![Page 55: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/55.jpg)
![Page 56: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/56.jpg)
EJEMPLO DE ARBOL BINARIO DE BUSQUEDA
El interés de los árboles binarios de búsqueda (ABB) radica en que su recorrido en inorden proporciona los elementos ordenados de forma ascendente y en que la búsqueda de algún elemento suele ser muy eficiente.
![Page 57: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/57.jpg)
INSERCION
La inserción es similar a la búsqueda y se puede dar una solución tanto iterativa como recursiva. Si tenemos inicialmente como parámetro un árbol vacío se crea un nuevo nodo como único contenido el elemento a insertar. Si no lo está, se comprueba si el elemento dado es menor que la raíz del árbol inicial con lo que se inserta en el subárbol izquierdo y si es mayor se inserta en el subárbol derecho. De esta forma las inserciones se hacen en las hojas.
![Page 58: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/58.jpg)
![Page 59: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/59.jpg)
BORRADO
La operación de borrado no es tan sencilla como las de búsqueda e inserción. Existen varios casos a tener en consideración:Borrar un nodo sin hijos ó nodo hoja: simplemente se borra y se establece a nulo el apuntador de su padre.
![Page 60: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/60.jpg)
![Page 61: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/61.jpg)
Borrar un nodo con un subárbol hijo:se borra el nodo y se asigna su subárbol hijo como subárbol de su padre.
![Page 62: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/62.jpg)
![Page 63: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/63.jpg)
Borrar Un Nodo Con Dos Sub árboles Hijo:
la solución está en reemplazar el valor del nodo por el de su predecesor o por el de su sucesor en inorden y posteriormente borrar este nodo. Su predecesor en inorden será el nodo más a la derecha de su subárbol izquierdo (mayor nodo del subárbol izquierdo), y su sucesor el nodo más a la izquierda de su subárbol derecho (menor nodo del subárbol derecho). En la siguiente figura se muestra cómo existe la posibilidad de realizar cualquiera de ambos reemplazos:
![Page 64: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/64.jpg)
![Page 65: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/65.jpg)
ARBOLES EQUILIBRADOS AVL
Los árboles AVL están siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en más de una unidad de la altura de la rama derecha. Gracias a esta forma de equilibrio (o balanceo), la complejidad de una búsqueda en uno de estos árboles se mantiene siempre en orden de complejidad O(log n). El factor de equilibrio puede ser almacenado directamente en cada nodo o ser computado a partir de las alturas de los subárboles
![Page 66: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/66.jpg)
![Page 67: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/67.jpg)
FACTOR DE EQUILIBRIO
Cada nodo, además de la información que se pretende almacenar, debe tener los dos punteros a los árboles derecho e izquierdo, igual que los árboles binarios de búsqueda (ABB), y además el dato que controla el factor de equilibrio.El factor de equilibrio es la diferencia entre las alturas del árbol derecho y el izquierdo:FE = altura subárbol derecho - altura subárbol izquierdo; Por definición, para un árbol AVL, este valor debe ser -1, 0 ó 1. Si el factor de equilibrio de un nodo es:0 -> el nodo está equilibrado y sus subárboles tienen exactamente la misma altura. 1 -> el nodo está equilibrado y su subárbol derecho es un nivel más alto. -1 -> el nodo está equilibrado y su subárbol izquierdo es un nivel más alto. Si el factor de equilibrio Fe≥2 o Fe≤-2 es necesario reequilibrar
![Page 68: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/68.jpg)
OPERACIONES
Las operaciones básicas de un árbol AVL implican generalmente el realizar los mismos algoritmos que serían realizados en un árbol binario de búsqueda desequilibrado, pero precedido o seguido por una o más de las llamadas "rotaciones AVL.
![Page 69: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/69.jpg)
ROTACIONES
El reequilibrado se produce de abajo hacia arriba sobre los nodos en los que se produce el desequilibrio. Pueden darse dos casos: rotación simple o rotación doble; a su vez ambos casos pueden ser hacia la derecha o hacia la izquierda.
![Page 70: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/70.jpg)
ROTACIÓN SIMPLE A LA DERECHA
De un árbol de raíz (r) y de hijos izquierdo (i) y derecho (d), lo que haremos será formar un nuevo árbol cuya raíz sea la raíz del hijo izquierdo, como hijo izquierdo colocamos el hijo izquierdo de i (nuestro i’) y como hijo derecho construimos un nuevo árbol que tendrá como raíz, la raíz del árbol (r), el hijo derecho de i (d’) será el hijo izquierdo y el hijo derecho será el hijo derecho del árbol (d).
![Page 71: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/71.jpg)
![Page 72: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/72.jpg)
ROTACIÓN SIMPLE A LA IZQUIERDA
De un árbol de raíz (r) y de hijos izquierdo (i) y derecho (d), consiste en formar un nuevo árbol cuya raíz sea la raíz del hijo derecho, como hijo derecho colocamos el hijo derecho de d (nuestro d’) y como hijo izquierdo construimos un nuevo árbol que tendrá como raíz la raíz del árbol (r), el hijo izquierdo de d será el hijo derecho (i’) y el hijo izquierdo será el hijo izquierdo del árbol (i).Precondición : Tiene que tener hijo derecho no vacío.
![Page 73: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/73.jpg)
![Page 74: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/74.jpg)
Si la inserción se produce en el hijo derecho del hijo izquierdo del nodo desequilibrado (o viceversa) hay que realizar una doble rotación.
ROTACIÓN DOBLE A LA DERECHA.
![Page 75: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/75.jpg)
INSERCIÓN
La inserción en un árbol de AVL puede ser realizada insertando el valor dado en el árbol como si fuera un árbol de búsqueda binario desequilibrado y después retrocediendo hacia la raíz, rotando sobre cualquier nodo que pueda haberse desequilibrado durante la inserción.Proceso de inserción:1.buscar hasta encontrar la posición de inserción o modificación (proceso idéntico a inserción en árbol binario de búsqueda) 2.insertar el nuevo nodo con factor de equilibrio “equilibrado” 3.desandar el camino de búsqueda, verificando el equilibrio de los nodos, y re-equilibrando si es necesario
![Page 76: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/76.jpg)
![Page 78: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/78.jpg)
El inconveniente que presentan estos árboles, es que al realizar modificaciones sobre él (insertar o borrar) podemos perder el equilibrio, por lo que tendremos que proceder al equilibrado del árbol mediante rotaciones.
![Page 79: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/79.jpg)
OPERACIONES
Los árboles AVL comparten las mismas operaciones básicas que el ABB,pero precedido o seguido por una o más de las llamadas "rotaciones AVL".
![Page 80: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/80.jpg)
INSERCIÓN
Puesto que las inserciones involucran a un único nodo nuevo, los desequilibrios siempre significan que en uno (o mas) de los nodos del árbol se produce una diferencia de altura entre su subárbol izquierdo y su subárbol derecho que es 2 o −2. Así pues, después de insertar en el árbol, la detección del desequilibrio es fácil, basta con examinar el campo balance. Si el balance es −2, es que hemos insertado un nuevo nodo en el subárbol izquierdo, y si es 2, la inserción tuvo lugar en el subárbol derecho
![Page 81: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/81.jpg)
FACTOR DE BALANCE
Los nodos tienen un Factor de Balance (FB) que está entre –1 y 1.
FB=Altura del subárbol derecho – Altura del subárbol izquierdo
FB = 0 alturas de subárbols iguales.
FB =1 subárbol derecho más grande que izquierdo.
FB = -1 subárbol izquierdo más grande que derecho
Para realizar la inserción, se realiza igual que en un árbol binario y después se verifica el balanceo.
![Page 82: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/82.jpg)
Ejemplo
13
21
10 18 2540
33
26
Al agregar el valor 26 el árbol cumple con las reglas de un AVL (el Factor de Balanceo de todos los nodos es 0, 1 ó –1) .
13
21
10 18 25
40
33
26
262627
Al agregar el valor 27 el árbol se DESBALANCEÓ (el Factor de Balanceo para el nodo con el valor 25 ahora es 2). Se requiere una ROTACIÓN.
![Page 83: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/83.jpg)
ROTACIONES
El reequilibrado se produce de abajo hacia arriba sobre los nodos en los que se produce el desequilibrio. Pueden darse dos casos: rotación simple o rotación doble; a su vez ambos casos pueden ser hacia la derecha o hacia la izquierda.
![Page 84: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/84.jpg)
1) Rotaciones simple a la Izquierda
5
3
2
A
C
B
D
Pívot
Raíz
Realizar la rotación a la izquierda
Baja
Sube
NODO PIVOTE: Es el nodo ancestro más cercano del nodo recién insertado cuyo Factor de Balanceo es diferente de cero.
![Page 85: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/85.jpg)
1) Rotaciones simple a la Izquierda
5
3
2
AC BD
Árbol balanceado
![Page 86: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/86.jpg)
2) Rotaciones simple a la derecha
3
5A
C
B
D
Raíz
7
Pívot
Realizar la rotación a la derecha
Baja
Sube
![Page 87: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/87.jpg)
2) Rotaciones simple a la derecha
3
5
A CB D
7 Árbol balanceado
![Page 88: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/88.jpg)
4
5
3
A
C
B
D
Pívot
Raíz
3) Rotaciones doble a la izquierda
2 Rotaciones simples
Baja
Sube
![Page 89: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/89.jpg)
4
5
3
A
CB
D
Pívot
Raíz
3) Rotaciones doble a la Izquierda
Baja
Sube
![Page 90: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/90.jpg)
4
53
ACB D
3) Rotaciones doble a la Izquierda
![Page 91: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/91.jpg)
4) Rotaciones doble a la derecha
4
C
B
D
Pívot
Raíz
5
3
A
Baja
Sube
![Page 92: Diapositiva de l estructura de datos](https://reader035.vdocuments.net/reader035/viewer/2022062706/557b1f04d8b42a796a8b4848/html5/thumbnails/92.jpg)
4) Rotaciones doble a la derecha
4
53
A C BD