en ciencias de la informática, un árbol es una estructura de datos ampliamenteusada que imita la forma de un árbol (un con...
   El recorrido en postorden, también llamado orden posterior consiste en       recorrer en primer lugar cada uno de los ...
   Representar el árbol con un array donde cada elemento es un nodo y las       relaciones padre-hijo vienen dadas por la...
En teoría de grafos, se usa la siguiente definición: «Un árbol binario es un    grafo conexo, acíclico y no dirigido tal q...
Estructura con arreglo indexado:typedefstructtArbol{int clave;tArbolhIzquierdo, hDerecho;} tArbol;tArbol árbol[NUMERO_DE_N...
voidpreorden(tArbol *a){if (a != NULL) {tratar(a);                   //Realiza una operación en nodopreorden(a->hIzquierdo...
voidpostorden(tArbol *a){if (a != NULL) {postorden(a->hIzquiedo);postorden(a->hDerecho);tratar(a);                //Realiz...
seguidamente el nivel 2, el 3 y así sucesivamente. En el árbol de la figura elrecorrido en amplitud sería: 2, 7, 5, 2, 6, ...
printf("%c,", nodo_actual->info); // se "procesa" el nodo donde va elrecorrido, en este caso se imprimeif (nodo_actual->iz...
Los árboles binarios también pueden ser almacenados como una estructurade datos implícita en vectores, y si el árbol es un...
El árbol binario puede ser pensado como el árbol original inclinado hacia los      lados, con los bordes negros izquierdos...
Un ejemplo de árbol binario no equilibrado(no es AVL)Un ejemplo de árbol binario equilibrado (si es AVL)El árbol AVL toma ...
[editar]Definición de árbol AVL      Un árbol vacío es un árbol AVL      Si es un árbol no vacío y       y    sus subárb...
RotacionesLas rotaciones internas en árboles binarios son operaciones internas comunesutilizadas para mantener el balance ...
arbolBin(R2, I2, arbolBin(R1, D2, D)) .ROTACIÓN SIMPLE A LA IZQUIERDA.De un árbol de raíz (r) y de hijos izquierdo (i) y d...
ROTACIÓN DOBLE A LA DERECHA.La Rotación doble a la Derecha son dos rotaciones simples, primero rotacionsimple izquierda y ...
InserciónLa inserción en un árbol de AVL puede ser realizada insertando el valor dado en elárbol como si fuera un árbol de...
Debido a que las rotaciones son una operación que tienen complejidad constantey a que la altura esta limitada a O (log(n))...
opinsertar: X$Elt AVL{X} -> AVLNV{X} .eq insertar(R, crear) == arbolBin(R, crear, crear) .ceqinsertar(R1, arbolBin(R2, I, ...
fi .ExtracciónEl procedimiento de borrado es el mismo que en el caso de árbol binario debúsqueda.La diferencia se encuentr...
El árbol resultante ha perdido altura.En borrado pueden ser necesarias varias operaciones de restauración delequilibrio, y...
BúsquedaEjemplo de TAD AVL en C#include <stdio.h>typedefstruct AVL{int dato, FB; // FB es la altura del subarbol izquierdo...
AVL* aux2 = A->der;     A->der = aux;     A->FB = 0;     A = aux2;}voidrotarLRalter(AVL* &A){ //precond: el arbol necesita...
A->izq = NULL;            A->der = NULL;aumento = true;            A->borrado = false;}else{if (n < A->dato){Insert(n, aum...
}aumento = false;break;                        }                    }                }}else{Insert(n, aumento, A->der);if ...
case 1:{                                 A->FB = 0;aumento = false;break;                         }                     } ...
if (A->borrado){returnfalse;}else{returntrue;                }}else if (n < A->dato){return Pertenece(A->izq, n);         ...
   Árboles Multicamino             Árboles B (Arboles de búsqueda multicaminoautobalanceados)                      Árbo...
Un árbol recibe el nombre de árbol con raíz si cada vértice ha sido designado raíz,en cuyo caso las aristas tienen una ori...
Upcoming SlideShare
Loading in …5
×

Para leer estructuras

680 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
680
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Para leer estructuras

  1. 1. en ciencias de la informática, un árbol es una estructura de datos ampliamenteusada que imita la forma de un árbol (un conjunto de nodos conectados).Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o másnodos hijos conectados a él. Se dice que un nodo es padre de un nodo siexiste un enlace desde hasta (en ese caso, también decimos que es hijode ). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodoque no tiene hijos se conoce como hoja. Los demás nodos (tienen padre y uno ovarios hijos) se les conoce como rama.DefiniciónFormalmente, podemos definir un árbol de la siguiente forma:  Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).  Un nuevo árbol a partir de un nodo y árboles de raíces con elementos cada uno, puede construirse estableciendo una relación padre-hijo entre y cada una de las raíces de los árboles. El árbol resultante de nodos tiene como raíz el nodo , los nodos son los hijos de y el conjunto de nodos hoja está formado por la unión de los conjuntos hojas iniciales. A cada uno de los árboles se les denota ahorasubárboles de la raíz.Una sucesión de nodos del árbol, de forma que entre cada dos nodosconsecutivos de la sucesión haya una relación de parentesco, decimos que esun recorrido árbol. Existen dos recorridos típicos para listar los nodos de unárbol: primero en profundidad y primero en anchura. En el primer caso, selistan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja,donde se vuelve al nodo anterior probando por el siguiente hijo y asísucesivamente. En el segundo, por su parte, antes de listar los nodos denivel (a distancia aristas de la raíz), se deben haber listado todos losde nivel . Otros recorridos típicos del árbol son preorden, postorden e inorden:  El recorrido en preorden, también llamado orden previo consiste en recorrer en primer lugar la raíz y luego cada uno de los hijos en orden previo.  El recorrido en inorden, también llamado orden simétrico (aunque este nombre sólo cobra significado en los árboles binarios) consiste en recorrer en primer lugar , luego la raíz y luego cada uno de los hijos en orden simétrico.
  2. 2.  El recorrido en postorden, también llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos en orden posterior y por último la raíz.Finalmente, puede decirse que esta estructura es una representación del conceptode árbol en teoría de grafos. Un árbol es un grafo conexo y acíclico.Operaciones de árboles. RepresentaciónLas rotaciones en árboles binarios son operaciones internas comunes utilizadaspara mantener el balance perfecto (o casi perfecto) del árbol binario. Un árbolbalanceado permite operaciones en tiempo logarítmico.Las operaciones comunes en árboles son:  Enumerar todos los elementos.  Buscar un elemento.  Dado un nodo, listar los hijos (si los hay).  Borrar un elemento.  Eliminar un subárbol (algunas veces llamada podar).  Añadir un subárbol (algunas veces llamada injertar).  Encontrar la raíz de cualquier nodo.Por su parte, la representación puede realizarse de diferentes formas. Las másutilizadas son:  Representar cada nodo como una variable en el heap, con punteros a sus hijos y a su padre.
  3. 3.  Representar el árbol con un array donde cada elemento es un nodo y las relaciones padre-hijo vienen dadas por la posición del nodo en el array.Uso de los árbolesUsos comunes de los árboles son:  Representación de datos jerárquicos.  Como ayuda para realizar búsquedas en conjuntos de datos (ver también: algoritmos de búsqueda en Árboles).Tipos de árboles  Árboles Binarios En ciencias de la computación, un árbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los árboles binarios son los árboles binarios de búsqueda, los montículos binarios y Codificación de Huffman. Definición de teoría de grafos Un árbol binario sencillo de tamaño 9, 4 niveles y altura 3 (altura = máximo nivel - 1), con un nodo raíz cuyo valor es 2.
  4. 4. En teoría de grafos, se usa la siguiente definición: «Un árbol binario es un grafo conexo, acíclico y no dirigido tal que el grado de cada vértice no es mayor a 3». De esta forma sólo existe un camino entre un par de nodos. Un árbol binario con enraizado es como un grafo que tiene uno de sus vértices, llamado raíz, de grado no mayor a 2. Con la raíz escogida, cada vértice tendrá un único padre, y nunca más de dos hijos. Si rehusamos el requerimiento de la conectividad, permitiendo múltiples componentes conectados en el grafo, llamaremos a esta última estructura un bosque. Tipos de árboles binarios Un árbol binario es un árbol con raíz en el que cada nodo tiene como máximo dos hijos. Un árbol binario lleno es un árbol en el que cada nodo tiene cero o dos hijos. Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas (vértices con cero hijos) están a la misma profundidad (distancia desde laraíz, también llamada altura). A veces un árbol binario perfecto es denominado árbol binario completo. Otros definen un árbol binario completo como un árbol binario lleno en el que todas las hojas están a profundidad n o n-1, para alguna n. Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. En un árbol binario cada nodo puede tener cero, uno o dos hijos (subárboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho. Implementación en C Un árbol binario puede declararse de varias maneras. Algunas de ellas son: Estructura con manejo de memoria dinámica, siendo puntA el puntero que apunta al árbol de tipo tArbol: typedefstructnodo { int clave; struct nodo *izdo, *dcho; }Nodo;
  5. 5. Estructura con arreglo indexado:typedefstructtArbol{int clave;tArbolhIzquierdo, hDerecho;} tArbol;tArbol árbol[NUMERO_DE_NODOS];En el caso de un árbol binario casi-completo (o un árbol completo), puedeutilizarse un sencillo arreglo de enteros con tantas posiciones como nodosdeba tener el árbol. La información de la ubicación del nodo en el árbol esimplícita a cada posición del arreglo. Así, si un nodo está en la posición i,sus hijos se encuentran en las posiciones 2i+1 y 2i+2, mientras que supadre (si tiene), se encuentra en la posición truncamiento((i-1)/2)(suponiendo que la raíz está en la posición cero). Este método se beneficiade un almacenamiento más compacto y una mejor localidad de referencia,particularmente durante un recorrido en preorden. La estructura para estecaso sería por tanto:int árbol[NUMERO_DE_NODOS];[editar]Recorridos sobre árboles binarios[editar]Recorridos en profundidadEl método de este recorrido es tratar de encontrar de la cabecera a la raízen nodo de unidad binaria. Ahora pasamos a ver la implementación de losdistintos recorridos:[Recorrido en preordenEn este tipo de recorrido se realiza cierta acción (quizás simplementeimprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual yposteriormente se trata el subárbol izquierdo y cuando se haya concluido, elsubárbol derecho. Otra forma para entender el recorrido con este metodoseria 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 y4.
  6. 6. voidpreorden(tArbol *a){if (a != NULL) {tratar(a); //Realiza una operación en nodopreorden(a->hIzquierdo);preorden(a->hDerecho); }}Implementación en pseudocódigo de forma iterativa:push(s,NULL); //insertamos en una pila (stack) el valor NULL, paraasegurarnos de que esté vacíapush(s,raíz); //insertamos el nodo raízMIENTRAS (s <> NULL) HACER p = pop(s); //sacamos un elemento de la pilatratar(p); //realizamos operaciones sobre el nodo p SI (D(p) <> NULL) //preguntamos si p tiene árbol derechoENTONCES push(s,D(p));FIN-SI SI (I(p) <> NULL) //preguntamos si p tiene árbol izquierdoENTONCES push(s,I(p));FIN-SIFIN-MIENTRAS[editar]Recorrido en postordenEn este caso se trata primero el subárbol izquierdo, después el derecho ypor último el nodo actual. Otra forma para entender el recorrido con estemetodo seria seguir el orden: nodo izquierda, nodo derecha, nodo raiz. Enel árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.
  7. 7. voidpostorden(tArbol *a){if (a != NULL) {postorden(a->hIzquiedo);postorden(a->hDerecho);tratar(a); //Realiza una operación en nodo }}Recorrido en inordenEn este caso se trata primero el subárbol izquierdo, después el nodo actualy por último el subárbol derecho. En un ABB este recorrido daría los valoresde clave ordenados de menor a mayor. Otra forma para entender elrecorrido con este metodo seria seguir el orden: nodoizquierda,nodoraiz,nodo derecha. En el árbol de la figura el recorrido eninorden sería: 2, 7, 5, 6, 11, 2, 5, 4, 9.Esquema de implementación:voidinorden(tArbol *a){if (a != NULL) {inorden(a->hIzquierdo);tratar(a); //Realiza una operación en nodoinorden(a->hDerecho); }}Recorridos en amplitud (o por niveles)En este caso el recorrido se realiza en orden por los distintos niveles delárbol. Así, se comenzaría tratando el nivel 1, que sólo contiene el nodo raíz,
  8. 8. seguidamente el nivel 2, el 3 y así sucesivamente. En el árbol de la figura elrecorrido en amplitud sería: 2, 7, 5, 2, 6, 9, 5, 11 y 4.Al contrario que en los métodos de recorrido en profundidad, el recorridopor niveles no es de naturaleza recursiva. Por ello, se debe utilizar una colapara recordar los subárboles izquierdos y derecho de cada nodo.El esquema algoritmo para implementar un recorrido por niveles esexactamente el mismo que el utilizado en la versión iterativa del recorridoen preorden pero cambiando la estructura de datos que almacena losnodos por una cola.Implementación en C:voidarbol_recorrido_anch (tipo_Arbol* A) {tipo_Colacola_nodos; // esta cola esta implementada previamente,almacena punteros (posiciones de nodos de árbol)tipo_Posnodo_actual; // este es un puntero llevara el recorridoif (vacio(A)) // si el árbol esta vacio, salimosreturn;cola_inicializa(&cola_nodos); // obvio, y necesariocola_enqueue(A, &cola_nodos); // se encola la raizwhile (!vacia(&cola_nodos)) { // mientras la cola no se vacie se realizara elrecorridonodo_actual = cola_dequeue(&cola_nodos) // de la cola saldran los nodosordenados por nivel
  9. 9. printf("%c,", nodo_actual->info); // se "procesa" el nodo donde va elrecorrido, en este caso se imprimeif (nodo_actual->izq != null) // si existe, ponemos el hijo izquierdo en la colacola_enqueue(nodo_actual->izq, &cola_nodos);if (nodo_actual->der != null) // si existe, ponemos el hijo derecho en la colacola_enqueue(nodo_actual->der, &cola_nodos); } // al vaciarse la cola se han visitado todos los nodos del árbol }Métodos para almacenar árboles binariosLos árboles binarios pueden ser construidos a partir de lenguajes deprogramación de varias formas. En un lenguaje con registros y referencias,los árboles binarios son construidos típicamente con una estructura denodos y punteros en la cual se almacenan datos, cada uno de estos nodostiene una referencia o puntero a un nodo izquierdo y a un nodo derechodenominados hijos. En ocasiones, también contiene un puntero a un úniconodo. Si un nodo tiene menos de dos hijos, algunos de los punteros de loshijos pueden ser definidos como nulos para indicar que no dispone de dichonodo. En la figura adjunta se puede observar la estructura de dichaimplementación.
  10. 10. Los árboles binarios también pueden ser almacenados como una estructurade datos implícita en vectores, y si el árbol es un árbol binario completo,este método no desaprovecha el espacio en memoria. Tomaremos comonotación la siguiente: si un nodo tiene un índice i, sus hijos se encuentranen índices 2i + 1 y 2i + 2, mientras que sus padres (si los tiene) seencuentra en el índice (partiendo de que la raíz tenga índice cero).Este método tiene como ventajas el tener almacenados los datos de formamás compacta y por tener una forma más rápida y eficiente de localizar losdatos en particular durante un preoden transversal. Sin embargo,desperdicia mucho espacio en memoria.Codificación de árboles n-arios como árboles binariosHay un mapeo uno a uno entre los árboles generales y árboles binarios, elcual en particular es usado en Lisp para representar árboles generalescomo árboles binarios. Cada nodo N ordenado en el árbol corresponde a unnodo N en el árbol binario; el hijo de la izquierda de N’ es el nodocorrespondiente al primer hijo de N, y el hijo derecho de N es el nodocorrespondiente al siguiente hermano de N, es decir, el próximo nodo enorden entre los hijos de los padres de N.Esta representación como árbol binario de un árbol general, se conoce aveces como un árbol binario primer hijo hermano, o un árbol doblementeencadenado.Una manera de pensar acerca de esto es que los hijos de cada nodo esténen una lista enlazada, encadenados junto con el campo derecho, y el nodosólo tiene un puntero al comienzo o la cabeza de esta lista, a través de sucampo izquierdo.Por ejemplo, en el árbol de la izquierda, la A tiene 6 hijos (B, C, D, E, F, G).Puede ser convertido en el árbol binario de la derecha.Un ejemplo de transformar el árbol n-ario a un árbol binario cómo pasar deárboles n-arios a árboles FLOFO.
  11. 11. El árbol binario puede ser pensado como el árbol original inclinado hacia los lados, con los bordes negros izquierdos representando el primer hijo y los azules representado los siguientes hermanos. Las hojas del árbol de la izquierda serían escritas en Lisp como: (((N O) I J) C D ((P) (Q)) F (M)) Que se ejecutará en la memoria como el árbol binario de la derecha, sin ningún tipo de letras en aquellos nodos que tienen un hijo izquierdo.  Árboles AVLÁrbol avl es un tipo especial de árbol binario ideado por los matemáticosrusos Adelson-Velskii y Landis. Fue el primer árbol de búsqueda binario auto-balanceable que se ideó.Descripción
  12. 12. Un ejemplo de árbol binario no equilibrado(no es AVL)Un ejemplo de árbol binario equilibrado (si es AVL)El árbol AVL toma su nombre de las iniciales de los apellidos de susinventores, Adelson-Velskii y Landis. Lo dieron a conocer en la publicación de unartículo en 1962: "Analgorithmfortheorganization of information" ("Un algoritmopara la organización de la información").Los árboles AVL están siempre equilibrados de tal modo que para todos losnodos, la altura de la rama izquierda no difiere en más de una unidad de la alturade la rama derecha o viceversa. Gracias a esta forma de equilibrio (o balanceo), lacomplejidad de una búsqueda en uno de estos árboles se mantiene siempre enorden de complejidad O(log n). El factor de equilibrio puede ser almacenadodirectamente en cada nodo o ser computado a partir de las alturas de lossubárboles.Para conseguir esta propiedad de equilibrio, la inserción y el borrado de los nodosse ha de realizar de una forma especial. Si al realizar una operación de inserción oborrado se rompe la condición de equilibrio, hay que realizar una seriede rotaciones de los nodos.Los árboles AVL más profundos son los árboles de Fibonacci.[Definición formal[editar]Definición de la altura de un árbolSea un árbol binario de búsqueda y sean y sus subárboles, sualtura , es:  si el árbol contiene solo la raíz  si contiene más nodos
  13. 13. [editar]Definición de árbol AVL  Un árbol vacío es un árbol AVL  Si es un árbol no vacío y y sus subárboles, entonces es AVL si y solo si:  es AVL  es AVL [editar]Factor de equilibrioCada nodo, además de la información que se pretende almacenar, debe tener losdos punteros a los árboles derecho e izquierdo, igual que los árboles binarios debú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 elizquierdo: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á desequilibrado y su subárbol derecho es un nivel más alto.-1 -> el nodo está desequilibrado y su subárbol izquierdo es un nivel más alto.Si el factor de equilibrio es necesario reequilibrar.[editar]OperacionesLas operaciones básicas de un árbol AVL implican generalmente el realizar losmismos algoritmos que serían realizados en un árbol binario debúsqueda desequilibrado, pero precedido o seguido por una o más de lasllamadas "rotaciones AVL".
  14. 14. RotacionesLas rotaciones internas en árboles binarios son operaciones internas comunesutilizadas para mantener el balance perfecto (o casi perfecto del árbol binario. Unárbol balanceado permite operaciones en tiempo logarítmicoEl reequilibrado se produce de abajo hacia arriba sobre los nodos en los que seproduce el desequilibrio. Pueden darse dos casos: rotación simple o rotacióndoble; a su vez ambos casos pueden ser hacia la derecha o hacia la izquierda.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 izquierdocolocamos el hijo izquierdo de i (nuestro i’) y como hijo derecho construimos unnuevo á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).oprotDer: AVL{X} -> [AVL{X}] .eqrotDer(arbolBin(R1, arbolBin(R2, I2, D2), D1)) ==
  15. 15. arbolBin(R2, I2, arbolBin(R1, D2, D)) .ROTACIÓN SIMPLE A LA IZQUIERDA.De un árbol de raíz (r) y de hijos izquierdo (i) y derecho (d), consiste en formar unnuevo árbol cuya raíz sea la raíz del hijo derecho, como hijo derecho colocamos elhijo derecho de d (nuestro d’) y como hijo izquierdo construimos un nuevo árbolque 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.oprotIzq: AVL{X} -> [AVL{X}] .eqrotIzq(arbolBin(R1, I, arbolBin(R2, I2, D2))) ==arbolBin(R2, arbolBin(R1, I, I2), D2) .Si la inserción se produce en el hijo derecho del hijo izquierdo del nododesequilibrado (o viceversa) hay que realizar una doble rotación.
  16. 16. ROTACIÓN DOBLE A LA DERECHA.La Rotación doble a la Derecha son dos rotaciones simples, primero rotacionsimple izquierda y luego rotación simple derecha.ROTACIÓN DOBLE A LA IZQUIERDA.La Rotación doble a la Izquierda son dos rotaciones simples, primero rotacionsimple derecha y luego rotación simple izquierda.
  17. 17. InserciónLa 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ésretrocediendo hacia la raíz, rotando sobre cualquier nodo que pueda habersedesequilibrado durante la inserción.Proceso de inserción:1.buscar hasta encontrar la posición de inserción o modificación (proceso idénticoa 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
  18. 18. Debido a que las rotaciones son una operación que tienen complejidad constantey a que la altura esta limitada a O (log(n)), el tiempo de ejecución para la inserciónes del orden O (log(n)).
  19. 19. opinsertar: X$Elt AVL{X} -> AVLNV{X} .eq insertar(R, crear) == arbolBin(R, crear, crear) .ceqinsertar(R1, arbolBin(R2, I, D)) ==if (R1==R2) thenarbolBin(R2, I, D)elseif (R1<R2) thenif ( (altura(insertar(R1,I)) – altura(D)) < 2) thenarbolBin(R2, insertar(R1, I), D)else ***hay que reequilibrarif (R1 <raiz(I)) thenrotarDer(arbolBin(R2, insertar(R1, I), D))elserotarDer(arbolBin(R2, rotarIzq(insertar(R1, I)), D))fi .fi .elseif ( (altura(insertar(R1,I)) – altura(D)) < 2) thenarbolBin(R2, insertar(R1, I), D)else *** hay que reequilibrarif (R1 >raiz(D)) thenrotarIzq(arbolBin(R, I, insertar(R1, D)))elserotatIzq(arbolBin(R, I, rotarDer(insertar(R1, D))))fi .fi .
  20. 20. fi .ExtracciónEl procedimiento de borrado es el mismo que en el caso de árbol binario debúsqueda.La diferencia se encuentra en el proceso de reequilibrado posterior. Elproblema de la extracción puede resolverse en O (log n) pasos. Una extraccióntrae consigo una disminución de la altura de la rama donde se extrajo y tendrácomo efecto un cambio en el factor de equilibrio del nodo padre de la rama encuestión, pudiendo necesitarse una rotación.Esta disminución de la altura y la corrección de los factores de equilibrio con susposibles rotaciones asociadas pueden propagarse hasta la raíz. Borrar A, y la nueva raíz será M. Borrado A, la nueva raíz es M. Aplicamos la rotación a laderecha.
  21. 21. El árbol resultante ha perdido altura.En borrado pueden ser necesarias varias operaciones de restauración delequilibrio, y hay que seguir comprobando hasta llegar a la raíz.opeliminar: X$Elt AVL{X} -> AVL{X} .eq eliminar(R, crear) == crear .ceqeliminar(R1, arbolBin(R2, I, D)) ==if (R1 == R2) thenifesVacio(I) then DelseifesVacio(D) then Ielseif (altura(I) - altura(eliminar(min(D),D)) < 2) thenarbolBin(min(D), I, eliminar(min(D), D)) ***tenemos que reequilibrarelseif (altura(hijoIzq(I) >= altura(hijoDer(I)))) thenrotDer(arbolBin(min(D), I, eliminar(min(D),D)))elserotDer(arbolBin(min(D), rotIzq(I), eliminar(min(D),D)))
  22. 22. BúsquedaEjemplo de TAD AVL en C#include <stdio.h>typedefstruct AVL{int dato, FB; // FB es la altura del subarbol izquierdo menos la altura del subarbolderecho AVL *izq, *der;bool borrado;} AVL;voidrotarLL(AVL* &A){ //precond: el arbol necesita una rotacion LL AVL* aux = A->izq->der; A->izq->der = A; A->izq->FB = 0; AVL* aux2 = A->izq; A->izq = aux; A->FB = 0; A = aux2;}voidrotarRR(AVL* &A){ //precond: el arbol necesita una rotacion RR AVL* aux = A->der->izq; A->der->izq = A; A->der->FB = 0;
  23. 23. AVL* aux2 = A->der; A->der = aux; A->FB = 0; A = aux2;}voidrotarLRalter(AVL* &A){ //precond: el arbol necesita una rotacion LRrotarRR(A->izq);rotarLL(A);}voidrotarRLalter(AVL* &A){ //precond: el arbol necesita una rotacion RLrotarLL(A->der);rotarRR(A);}AVL* Crear(){return NULL;}void Insert(int n, bool&aumento, AVL* &A){if (A == NULL){ A = new AVL;A->dato = n; A->FB = 0;
  24. 24. A->izq = NULL; A->der = NULL;aumento = true; A->borrado = false;}else{if (n < A->dato){Insert(n, aumento, A->izq);if (aumento){switch (A->FB){case -1:{ A->FB = 0;aumento = false;break; }case 0:{ A->FB = 1;aumento = true;break; }case 1:{if (A->izq->FB == 1){ // Si es 1 necesita una rotacion LL si es -1 necesita unarotacion LRrotarLL(A); }else{rotarLRalter(A);
  25. 25. }aumento = false;break; } } }}else{Insert(n, aumento, A->der);if (aumento){switch (A->FB){case -1:{if (A->der->FB == 1){ // Si es 1 necesita una rotacion RL si es -1 necesita unarotacion RRrotarRLalter(A); }else{rotarRR(A); }aumento = false;break; }case 0:{ A->FB = -1;aumento = true;break; }
  26. 26. case 1:{ A->FB = 0;aumento = false;break; } } } } }}void Insertar(AVL* &A, int n){bool aumento;Insert(n, aumento, A);}boolEsVacio(AVL* A){return A == NULL;}bool Pertenece(AVL* A, int n){if (A == NULL){returnfalse; }else{if (A->dato == n){
  27. 27. if (A->borrado){returnfalse;}else{returntrue; }}else if (n < A->dato){return Pertenece(A->izq, n); }else{return Pertenece(A->der, n); } }}void Borrar(AVL* &A, int n){if (A->dato == n){ A->borrado = true;}else if (n < A->dato){Borrar(A->izq, n); }else{ Borrar(A->der, n); }}  Árboles Rojo-Negro  Árbol AA
  28. 28.  Árboles Multicamino  Árboles B (Arboles de búsqueda multicaminoautobalanceados)  Árbol-B+  Árbol-B*Árbol (teoría de grafos)Para otros usos de este término, véase Árbol (desambiguación).En teoría de grafos, un árbol es un grafo en el que cualesquierados vértices están conectados por exactamente un camino. Un bosque es unaunión disjunta de árboles. Un árbol a veces recibe el nombre de árbol libre.[editar]DefinicionesUn árbol es un grafo simple unidireccional G que satisface alguna de lassiguientes condiciones equivalentes:  G es conexo y no tiene ciclos .  G no tiene ciclos y, si se añade alguna arista se forma un ciclo.  G es conexo y si se le quita alguna arista deja de ser conexo.  G es conexo y el grafo completo de 3 vértices no es un menor de G.  Dos vértices cualquiera de G están conectados por un único camino simple.Si G tiene muchos vértices, n, entonces las definiciones anteriores son tambiénequivalentes a cualquiera de las siguientes condiciones:  G es conexo y tiene n − 1 aristas.  G es conexo y sin ciclos .  Cualesquiera 2 vértices están unidos por una única trayectoria.un grafo unidireccional simple G es un bosque si no tiene ciclos simples.Un árbol dirigido es un grafo dirigido que sería un árbol si no se consideraran lasdirecciones de las aristas. Algunos autores restringen la frase al caso en el quetodos las aristas se dirigen a un vértice particular, o todas sus direcciones partende un vértice particular.
  29. 29. Un árbol recibe el nombre de árbol con raíz si cada vértice ha sido designado raíz,en cuyo caso las aristas tienen una orientación natural hacia odesde la raíz. Losárboles con raíz, a menudo con estructuras adicionales como orden de los vecinosde cada vértice, son una estructura clave en informática; véase árbol(programación).Un árbol etiquetado es un árbol en el que cada vértice tiene una única etiqueta.Los vértices de un árbol etiquetado de n vértices reciben normalmente lasetiquetas {1,2, ..., n}.Un árbol regular u homogéneo es un árbol en el que cada vértice tiene elmismo grado.[editar]PropiedadesTodo árbol es a su vez un grafo bipartito. Todo árbol con sólo un conjuntonumerable de vértices es además un grafo plano.Todo grafo conexo G admite un árbol de expansión, que es un árbol que contienecada vértice de G y cuyas aristas son aristas de G.Dado n vértices etiquetados, hay n n−2 maneras diferentes de conectarlos paraconstruir un grafo. El resultado se llama fórmula de Cayley. El número de árbolescon n vértices de gradod1,d2,...,dn es:que es un coeficiente multinomial.Contar el número de árboles no etiquetados es un problema complicado. Dehecho, no se conoce ninguna fórmula para el número de árboles t(n)con n vértices (debe entederse aquí el número de árboles diferentes salvoisomorfismo de grafos). Los primeros valores de t(n) son 1, 1, 1, 1, 2, 3, 6, 11, 23,47, 106, 235, 551, 1301, 3159, ... (sucesión A000055 en OEIS). Otter (1948) probóqueUna fórmula más exacta para el comportamiento asintótico de t(n) implica que haydos números α y β (α ≈ 3 y β ≈ 0.5) tales que:

×