SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
Unidad 7 
                 Árboles Binarios 


•Biblio: “Algoritmos y Estructuras de datos” de Aguilar y Martinez. Unidad 14 y 15 
•Autor: Ing Rolando Simon Titiosky.
Árboles Generales 
 Intuitivamente el concepto de árbol implica 
   una estructura donde los datos se 
   organizan de modo que los elementos de 
   información estén relacionados entre sí a 
   través de ramas. 



Definición recursiva: Árbol es un 
   conjunto de nodos que: 
•  Es vacío, o bien, 
•  Tiene un nodo raíz del que descienden 
   0 o más subárboles.
Árboles Generales 
•  Nodos: conjunto finito de 
   elementos. 
                                                           15 
•  Ramas: conjunto finito de líneas 
   dirigidas, que conectan  nodos. 
•  Grado del Nodo: número de                        6               20 
   ramas descendentes con un 
   nodo. 
•  Raíz: primer nodo de un árbol no            4         10      17       22 
   vacío. 
•  Camino: secuencia de nodos en 
                                              Raiz=15 
   los que c/nodo es adyacente al 
   siguiente.                                 Nodos: 15, 6, 20…. 
   –  Solo existe 1 camino entre la Raíz y    Ramas(15, 6); (20, 17) 
      un Nodo cualquier. 
   –  La distancia de un Nodo a la Raíz       Grado del 15= G(15)=2 
      determina la rapidez de búsqueda. 
                                              G(10)=0; G(20)=2
Terminología 
                  A      Nivel 0      •    Padre: tiene Nodos sucesores. 
                                      •    Hijos: Nodos sucesores. 
                                      •    Descendientes: Hijos de los hijos 
        B     Nivel 1       C         •    Ascendientes: los padre y abuelos 
                                           de un nodo hijo. 
                                      •    Hermanos: 2 o mas nodos del 
   D         E         F         G         mismo padre. 
                                      •    Hojas: nodo sin hijos . 
                         Nivel 2
                                      •    Nivel de un nodo: distancia a la raíz. 
•Padres: A; B y C.                    •    Altura o profundidad de un árbol: 
•Hijos: De A( B y C), de B (D y E)         nivel de la hoja del camino más largo 
                                           desde la raíz más uno. 
•Descendentes de B: D y E 
                                        –  La altura de un árbol vacío es 0. 
•Ascendientes de E: B y A. 
                                    •  Subárbol: cualquier estructura 
•Hermano: {B, C}, {F, G}               conectada por debajo del raíz. 
•Hojas: D, E, F, G                     C/nodo de un árbol es la raíz de un 
•Altura del Árbol: 3                   subárbol que se define por el nodo y 
•Altura del Subárbol de B: 2           todos los descendientes del nodo. 
Equilibrio en Árbol Binario 
•  Factor de Equilibrio: diferencia de altura 
   entre los 2 subárboles de un nodo. 
  – fe=h  –h 
        d  i. 
  – Árbol Equilibrado: –1<fe<1. Ej: fe=3–2=1 
  – Árbol Perfectamente Equilibrado: fe=0. 

               10                                        15 
               –1                                            0 

     4                     17                     6                 20 
                           0                 0                          0 
     1 

          6          15          20     4              10         17         22 
          Árbol Equilibrado            Árbol  Perfectamente Equilibrado 
Árbol Binario 
  •  Árbol donde ningún nodo puede tener mas de 2 subárboles. 
                                                       n+1 
  •  En cualquier nivel n, solo puede contener de 1 a 2  –1 nodos 
  •  Árbol Completo: de Altura n  es un árbol en el que para c/nivel, 
     del 0 al n–1, está lleno de nodos. Todos los nodos hoja a nivel n 
     ocupan posiciones a la izquierda. 
  •  Árbol  Lleno: tiene el máximo número de entradas para su altura: 
      n.                     k+1 
     2  A Nivel  k , tendrá 2  –1 nodos. (Nivel = Profundidad–1) 
                                               2+1          3 
       –  Lleno de Profundidad 3 = Nivel 2 => 2  –1 nodos= 2  –1= 7 nodos 
  •  Árbol Degenerado: hay un solo nodo hoja (el 18) y cada nodo no 
     hoja tiene solo un hijo. Equivalente a una lista enlazada. 


                                                20                            15 
                                                                              15 
     5 
     5                                          20 
          9 
          9                              10 
                                         10           32 
                                                      32               6 
                                                                       6              20 
                                                                                      20 
       12 
                                    4 
                                    4          15 
                                               15     31 
                                                      31    45 
                                                            45 
       12 
               18 
               18              1 
                               1         6 
                                         6                        4 
                                                                  4         10 
                                                                            10      17 
                                                                                    17      22 
                                                                                            22 
Degenerado de profundidad 4         Completo de profundidad 4     Lleno de profundidad 3 
TAD Árbol Binario: Especificación 
•  Tipo de Dato 
   –  Nodos del Árbol (se especifica en filmina siguiente) 
•  Operaciones 
   –    Altura: de un árbol 
   –    Borrar: Elimina del árbol a un nodo dado 
   –    Búsqueda: Buscar un elemento en un Árbol de Búsqueda 
   –    Construir: crea un árbol con un elemento raíz y dos ramas. 
   –    Copiar: crear una copia del árbol 
   –    CrearArbol: Inicia un árbol vacío 
   –    Derecho: da la rama derecha de un árbol dado. 
   –    Elementos: determina el número de elementos del árbol 
   –    EsVacio: comprueba si el árbol tiene nodos 
   –    Iguales: determinar si dos árboles son idénticos 
   –    Insertar: inserta un nodo dentro de un árbol 
   –    Izquierdo: da la rama izquierda de un árbol dado. 
   –    Pertenece: Determina si un elemento pertenece a un árbol. 
   –    Recorrer: el árbol de acuerdo algunos de los criterios 
   –    Profundidad: determina la profundidad de un árbol dado 
   –    Raiz:devuelve el nodo raíz. 
   –    ….
Estructura de Datos 
                       del Árbol Binario 
Typedef int TipoElemento; 
Typedef struct nodo 
{ 
   TipoElemento        dato; 
   struct nodo  *izq; 
   struct nodo  *der; 

} Nodo;                                                                                     Nodo Raíz
                                                                     A 
                                                                     A 
Typedef Nodo* ArbolBinario; 

                                           B 
                                           B                                         C 
                                                                                     C 


                 D 
                 D                         null  E 
                                           null  E               null 
                                                                 null     F  null 
                                                                          F  null         null  G 
                                                                                          null  G    null 
                                                                                                     null 



                                                      null 
                                                      null    H  null 
                                                              H  null 
     null 
     null    I  null 
             I  null    null  N 
                        null  N    null 
                                   null 
Creación del Árbol 
Void nuevoArbol(ArbolBinario* raíz, ArbolBinario ramaIzq, 
   TipoElemento x, ArbolBinario ramaDer) 
{  *raiz=crearNodo(x); 
   (*raíz)–>izq=ramaIzq; 
   (*raíz)–>der=ramaDer; 
} 
                                                             raiz
ArbolBinario crearNodo(TipoElemento x) 
{  ArbolBinario a;                                   a 
   a=(ArbolBinario) malloc(sizeof(Nodo));         null  x 
                                                  null  x     null 
                                                              null 
   a.dato=x; 
   a.Izq=a.Der=NULL; 
   return a; 
} 
Ejemplo trivial 
ArbolBinario raíz, a1, a2; 
                                                    Void nuevoArbol(ArbolBinario* raíz, 
Pila pila;                                          ArbolBinario ramaIzq, TipoElemento x, 
nuevoArbol(&a1,NULL, “Maria”,NULL);                 ArbolBinario ramaDer)
nuevoArbol(&a2,NULL, “Rodrigo”,NULL); 
nuevoArbol(&raiz,a1, “Esperanza”,a2); 
Insertar(&pila, raíz); 
nuevoArbol(&a1,NULL, “Any”,NULL); 
nuevoArbol(&a2,NULL, “Abel”,NULL); 
nuevoArbol(&raiz,a1, “Jesus”,a2); 
Insertar(&pila, raíz); 
a2=quitar(&pila); 
a1=quitar(&pila); 
nuevoArbol(&raiz,a1, “Esperanza”,a2); 
                                                         Esperan 
                                                         Esperan 
                            raiz                         za 
                                                         za 


                            Espera 
                            Espera                                         Jesus 
                                                                           Jesus 
    a1                       nza 
                              nza 


null  Maria  null 
null  Maria null               null  Rodri  null 
                               null  Rodri  null      null 
                                                      null    Any  null 
                                                              Any  null             null  Abel  null 
                                                                                    null  Abel  null 
                     a2 
                                     go 
                                     go 
Recorrido del Árbol 
•  Recorrer el Árbol significa que cada nodo sea procesado 
   una vez y solo una en un secuencia determinada. 
   Existen 2 enfoques generales 
   –  Recorrido en Profundidad: el proceso exige alcanzar las 
      profundidades de un camino desde la raíz hacia el descendiente 
      mas lejano del primer hijo, antes de proseguir con el segundo. 
   –  Recorrido en Anchura: el proceso se realiza horizontalmente 
      desde la raíz a todos su hijos antes de pasar con la 
      descendencia de alguno de ellos. 



          1                    2                     3 


    2           3       1            3        1            2 
     Preorden RID         EnOrden IRD           PostOrden IDR 
     Raiz–IZQ–DER         IZQ–Raiz–DER          IZQ–Raiz–DER
Recorrido PreOrden (RID) 
void preOrden(ArbolBinario raíz) 
{  if(raiz) 
   {  visitar(raiz–>dato); 
        preOrden(raiz–>izq); 
        preOrden(raiz–>der); 
   }                           void visitar(TipoElemento x) 
}                                 {printf(“ %i ”, x);}

 El recorrido en PreOrden del                 15 
    árbol es el siguiente: 
 15, 6, 4, 10, 20, 17, 22             6                20 

                                      4     10    17     22 
Recorrido EnOrden (IRD) 
void enOrden(ArbolBinario raíz) 
{  if(raiz) 
   {  enOrden(raiz–>izq); 
        visitar(raiz–>dato); 
        enOrden(raiz–>der); 
   } 
} 
 El recorrido en EnOrden del árbol         15 
    es el siguiente: 
 4, 6, 10, 15, 17, 20, 22           6              20 

                                 4       10      17      22 
Recorrido PostOrden (IDR) 
void PostOrden(ArbolBinario raíz) 
{  if(raiz) 
   {  PostOrden(raiz–>izq); 
        PostOrden(raiz–>der); 
        visitar(raiz–>dato); 
   } 
} 
 El recorrido en PostOrden del               15 
    árbol es el siguiente: 
 4, 10, 6, 17, 22, 20, 15             6              20 

                                 4         10      17      22 
Comparemos Recorridos 
•  PreOrden RID                                18 
  –  18, 12, 5, 9, 28, 20, 35 
•  EnOrden IRD                           12            28 
  –  5, 9, 12, 18, 20, 28, 35 
                                    5            20          35 
•  PostOrden IDR 
  –  9, 5, 12, 20, 35, 28, 18            9 

                Árbol Binario de Búsqueda 
Como en el Ejemplo, dado un Nodo cualquiera del Árbol, 
todos los datos de su Subárbol IZQ son menores, y los del 
Subárbol DER son mayores: I<R<D: Por esto, solo el 
recorrido IRD, dará la secuencia ordenada del árbol.
Profundidad de un Árbol Binario 
int profundidad (ArbolBinario raíz) 
{  if (!raiz)  return 0 ; /*Árbol vacío*/ 
   else 
   {  int profundidadI = profundidad (raiz ­> izq); 
         int profundidadD = profundidad (raíz ­> der); 
         if (profundidadI > profundidadD) 
                return profundidadI + 1; 
         else 
                return profundidadD + 1; 
   } 
} 
 Altura o profundidad de un árbol: nivel de la hoja del camino más largo 
 desde la raíz más uno. La altura de un árbol vacío es 0.
Creación de un Árbol 
             Binario de Búsqueda 
•  Se desean almacenar los números 8, 3, 1, 20, 
   10, 5 y 4 en un Árbol Binario de Búsqueda. 
•  La Única Regla es que I<R<D. 
•  Inicialmente el Árbol está vacío y la única opción 
   para el 8 es ser el Nodo Raíz. 
•  Luego viene 3, es menor a 8: va al subárbol IZQ 
•  Luego el 1, menor al 8 y al 3. 
                                                            8 
                                                            8 
             x                   8 
                                 8           8 
                                             8 

                                                       3 
                                                       3 
                                        3 
                                        3 
    y < x         Z > x                           1 
                                                  1 
Creación de un Árbol 
        Binario de Búsqueda (cont.) 
•  Se desean almacenar los números 8, 3, 1, 20, 10, 5 y 4 
   en un Árbol Binario de Búsqueda. 
•  Luego el 20, mayor al 8 
•  Así hasta insertar todos los elementos. 
•  PROPIEDAD de los Árboles Binarios de Búsqueda: 
   –  No son únicos y depende del orden en el cual se fueron 
      insertando los elementos 

             8 
             8                    8 
                                  8                      8 
                                                         8                      8 
                                                                                8 

        3 
        3         20 
                  20         3 
                             3           20 
                                         20         3 
                                                    3                      3 
                                                                           3           20 
                                                                                       20 
                                                                20 
                                                                20 

   1                    1                                             1 
                                                                      1         5 
                                                                                5    10 
                                                                                     10 
   1                    1          10 
                                   10          1 
                                               1              10 
                                                              10 
                                                         5 
                                                         5 
                                                                           4
                                                                           4 
Búsqueda en Árbol de Búsqueda 
Nodo *buscar(Nodo *raiz, TipoElemento buscado) 
{    if(!raiz)     return 0;  /*Árbol vacío*/ 
     else  if (buscado==raiz–>dato) return raiz; 
     else  if (buscado<raiz–>dato) 
             return buscar(raiz–>izq, buscado); 
     else 
             return buscar(raiz–>der, buscado); 

}
Insertar en Árboles de Búsqueda 
•  Es una extensión de la operación de Búsqueda 
   –  Si el árbol está vacío se inserta directamente 
   –  SINO: Buscará en el árbol el lugar correcto de Inserción 



void insertar (Nodo** raiz, TipoElemento dato) 
{  if (!(*raiz)) 
         *raiz = crearNodo(dato); 
   else if (dato < (*raiz) ­> dato) 
         insertar (&((*raiz) ­> izdo), dato); 
   else 
         insertar (&((*raiz) ­> dcho), dato); 
}
Eliminar de un Árbol Binario de Búsqueda 
•  Es una extensión de la operación de búsqueda. 
•  Mantendrá la estructura de Árbol Binario de 
   Búsqueda. 
•  Presenta 2 casos bien diferenciados 
  –  1er: El Nodo a eliminar es Hoja o Hijo único 
     •  Se Asignará al Padre del nodo a eliminar, su único 
        descendiente. (El Abuelo se encargará del Nieto) 
  –  2do: El nodo a borrar tiene sus dos hijos. Se Puede 
     •  Reemplazar el dato del nodo con el Menor de las Claves 
        Mayores del Subárbol Derecho. 
     •  Reemplazar el dato del nodo con el Mayor de las Claves 
        Menores del Subárbol Izquierdo. 
         –  Bajaremos al 1er nodo de la Rama Izquierda 
         –  Como la clave mayor está a la derecha, se continúa bajando a 
            derecha hasta encontrar un nodo hoja (El Mayor de los 
            Menores que reemplazará el dato a eliminar).
Eliminar de un Árbol Binario de 
             Búsqueda            8 
                                 8 

•  Eliminar el Nodo 8.                         3 
                                               3                  20 
                                                                  20 
                                     1 
                                     1                          10 
                                                                10 
•  Bajaremos al 1er nodo de la                       5 
                                                     5 

   Rama Izquierda: Nodo 3                      4 
                                               4 

•  Como la clave mayor está a su                         5 
                                                         5 
   derecha, se continúa bajando a               3 
                                                3                     20 
                                                                      20 
   derecha hasta encontrar un 
                                      1 
                                      1                  ??  
                                                         ??      10 
                                                                 10 
   nodo sin rama DER: El nodo 5. 
                                                4 
                                                4 
•  Se reemplaza el 8 por el 5. 
                                                          5
                                                          5 
•  Queda un caso de Hijo Único. 
                                                    3 
                                                    3                  20 
                                                                       20 
•  El Abuelo (3) se encargará del 
                                          1 
                                          1               4 
                                                          4       10 
                                                                  10 
   Nieto (4). 
Eliminar de un Árbol Binario de Búsqueda 
                                                         void reemplazar(Nodo** act) 
void eliminar (Nodo** r, TipoElemento                    {  Nodo* a, *p; 
   dato) 
                                                            p = *act; 
{  if (!(*r)) puts("Nodo no encontrado"); 
                                                            a = (*act) ­> izdo;/* menores a IZQ*/ 
   else if (dato < (*r) ­> dato) 
                                                            while (a ­> dcho) 
          eliminar(&(*r) ­> izdo, dato); 
                                                            {       p = a; /* buscamos el Mayor a DER*/ 
   else if (dato > (*r) ­> dato) 
                                                                    a = a ­> dcho; 
          eliminar(&(*r) ­> dcho,dato); 
                                                            } 
   else  /* Nodo encontrado */ 
   {      Nodo* q; /* puntero al nodo a suprimir */          ;/* Cambio de Campo Datos*/ 
          q = (*r);  /* r es el ptr del nodo Padre */       (*act) ­> dato = a ­> dato; 
                                                             /* Al Abuelo p, se hace cargo de nieto IZQ*/ 
          if (q ­> izdo == NULL) 
                      (*r) = q ­> dcho;                       if (p == (*act)) 
          else if (q ­> dcho == NULL)                               p ­> izdo = a ­> izdo; 
                     (*r) = q ­> izdo;                        else 
          else /* tiene rama izquierda y derecha */                 p ­> dcho = a ­> izdo; 
                     reemplazar(&q);                          (*act) = a; 
          free(q);                                       } /* Ojo: No puede tener nada a Derecha, 
                                                             pues abríamos bajado en el while.*/
   } 
} 
AVL:  Árbol Binario 
          Ordenado y Balanceado 
•  Considerando a un árbol de n nodos. 
   –  Eficiencia en Búsquedas en árboles Equilibrados F(n)=Log n 
   –  En los demás: log n <= F(n) <=n 
•  Para Optimizar las Búsquedas, se intentará mantener 
   los Árboles Binarios Ordenados I<R<D y Equilibrados. 
   –  Llamados Árboles AVL  (Adelson–Velskii–Landis) 
   –  Se caracterizan porque la Altura B=h  –h  : –1<=B<=1 
                                           d  i 
   –  Restringe la altura de cada uno de los Subárboles 
   –  Se necesita un campo “FE” (Factor de Equilibrio) en cada nodo. 

       struct nodo 
                {        TipoElemento  dato; 
                         int fe; 
                         struct nodo   *izq, *der; 
               } Nodo;
Inserción en AVL 
•  La Inserción se hace siguiendo el camino de búsqueda 
•  Puede aumentar la altura de una rama, de manera que 
   cambie el factor de equilibrio de dicho nodo. 
     –  Implica que se retornará por el camino de búsqueda para 
        actualizar el FE de c/nodo 
     –  Se puede llegar a Desbalancear (Altura=2) => ReBalanceo. 
     –  O Puede mejorar: Si al Árbol X se le Inserta el 3, resultará en 
        Perfectamente Balanceado. 
•  El Proceso termina cuando se llega a la Raiz o cuando 
   termina el Rebalanceo del mismo. 
h IZQ                                  h DER       h IZQ                                    h DER 
3               10                         3       4                 10 
                                                                     10                         3 
                0                                                    –1 

     4                      17                     3       4 
                                                           4                     17 
                                                                                 17                2 
2                                 0           2            2                           0 
      1 
                                                   2            6 
                                                                6          15 
                                                                           15           20 
                                                                                        20         1
1          6          15           20         1             –1                   0            0 
     0                      0            0            5           Árbol x + Nodo 5 
                Árbol x                            1  5 
Reestructuración AVL 
     Hay 4 casos posibles a tener en cuenta, según donde se 
       hizo la Inserción. 
                                                                             A 
                                                                             A 
                                     A 
                                     A 
1. Inserción en el                        2. Inserción en el Subárbol DER 
     Subárbol IZQ De la                        De la Rama IZQ de A 
     Rama IZQ de A 
                                                                             A 
                                                                             A 
3. Inserción  en el Subárbol    A 
                                A          4. Inserción en el Subárbol 
     DER                                        DER De la Rama IZQ de A 
De la Rama DER de A 



  •  Solución: La ROTACION le devuelve el equilibrio al árbol. 
        –  Rotación Simple: Caso 1 y 3: Implica a A y su descendiente 
        –  Rotación Doble: Caso 2 y 4: Implica a los 3 nodos 
  •  Soluciones simétricas: En c/caso, las ramas están 
     opuestas.
AVL: Rotación Simple 
•  Luego de Insertar el Nodo A el árbol quedó                                  n 
                                                              –2 
   desbalanceado. 
                                                   n1                     C 
                                                                          C 
•  Según que rama ha crecido, la Rotación 
   Simple puede ser de izquierda–izquierda (II)                     B 
                                                                    B 
                                                                         –1 
   o derecha–derecha(DD).                                 A 
                                                          A 
•  Movimientos de Ptrs.                              0 
   –  n es ptro al nodo problema: Fe=­2 
   –  IZQ (nuestro ej). N1 apunta a rama IZQ                         n
       •  n­>izq=n1–>der                           n1 
                                                                      0 
       •  n1­>der=n 
                                                                    B 
                                                                    B 
       •  n=n1                                                          0 
                                                              A 
                                                              A 
   –  DER. N1 apunta a rama DER                                                C 
                                                                               C 
       •  n­>der=n1–>izq                                 0 
       •  n1­>izq=n 
       •  n=n1 
AVL: Rotación Doble 
Movimientos de Ptrs. 
•  n apunta al nodo problema (Fe=­2); n1 al 
   hijo de n con problemas, n2 al hijo de n1 
•  DI(nuestro ej). Derecha–izquierda 
   –  n1­>izq=n2–>der                           La solución consiste 
   –  n2–>der=n1                                en subir el 40, pender 
                                                el 30 a su izquierda y 
   –  n­>der=n2–>izq                            el 60 a su derecha. 
   –  n2–>izq=n 
   –  n=n2 
                                                                        n 
•  ID: izquierda–derecha                             2 
                                                           30 
                                                           30 
   –  n1­>der=n2–>izq 
   –  n2–>izq=n1             n2      n1             n1                60 
                                                                      60 
   –  n­>izq=n2–>der                                        40 
                                                            40          –1 
                                   40 
                                   40              n2 
   –  n2–>der=n 
   –  n=n2                                                       0 
                             30 
                             30          60 
                     n                   60 
Eliminación de un Nodo AVL 
•     Luego de eliminar un nodo con cierta clave, el 
      árbol resultante debe seguir siendo AVL 
•     El Algoritmo puede descomponerse en dos 
      partes bien diferenciadas 
     1.  Eliminar el Nodo: según la estrategia que vimos en 
         la Eliminación de Nodo en Árbol de Búsqueda 
     2.  Balancear: se debe seguir el camino de búsqueda 
         en sentido inverso: 
        2.1. Arreglando el Factor de Equilibrio 
        2.1. Restaurar el Equilibrio allí donde se rompe.
Trabajos Prácticos Unidad 7 
            COMO MINIMO, REALIZAR: 
•  De la Bibliografía 
  –  Del Capitulo 14: 
     •  Ejercicios: 14.1 al 14.8, 14.11 
     •  Problemas: 14.2, 14.3, 14.7 
  –  Del Capitulo 15: 
     •  Ejercicios:15.1, 15.6, 15.10 
     •  Problemas: 15.1 
•  Complementarios: 
  –  Equilibrar los Árboles de 14.1 al 14.8, 14.11

Más contenido relacionado

La actualidad más candente

Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos Kaneki04
 
Estructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasEstructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasHuascar Génere
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesJosé Antonio Sandoval Acosta
 
Arboles ppt
Arboles pptArboles ppt
Arboles pptINFOP
 
Programación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosProgramación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosAngel Vázquez Patiño
 
Importancia de la implementación de las listas para la estructura de datos
Importancia de la implementación de las listas para la estructura de datosImportancia de la implementación de las listas para la estructura de datos
Importancia de la implementación de las listas para la estructura de datospepelebu1313
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacionLuis Igoodbad
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colasknowallrpa
 
Arboles B y Arboles B+
Arboles B y Arboles B+Arboles B y Arboles B+
Arboles B y Arboles B+neltherdaza
 
Pilas como estructura de datos..
Pilas como estructura de datos..Pilas como estructura de datos..
Pilas como estructura de datos..NANO-06
 
1 - Modelo Entidad Relacion
1 - Modelo Entidad Relacion1 - Modelo Entidad Relacion
1 - Modelo Entidad RelacionJuGGaLoFX
 

La actualidad más candente (20)

Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Colas
ColasColas
Colas
 
Estructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasEstructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colas
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Tipos de listas en estructura de datos
Tipos de listas en estructura de datosTipos de listas en estructura de datos
Tipos de listas en estructura de datos
 
Listas
ListasListas
Listas
 
Estructuras no-lineales
Estructuras no-linealesEstructuras no-lineales
Estructuras no-lineales
 
Arboles ppt
Arboles pptArboles ppt
Arboles ppt
 
Programación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosProgramación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenados
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
ARBOLES BINARIOS
ARBOLES BINARIOSARBOLES BINARIOS
ARBOLES BINARIOS
 
Algoritmos de Ordenamiento externo
Algoritmos de Ordenamiento externoAlgoritmos de Ordenamiento externo
Algoritmos de Ordenamiento externo
 
Importancia de la implementación de las listas para la estructura de datos
Importancia de la implementación de las listas para la estructura de datosImportancia de la implementación de las listas para la estructura de datos
Importancia de la implementación de las listas para la estructura de datos
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacion
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colas
 
Indices tipo arbol b+
Indices tipo arbol b+Indices tipo arbol b+
Indices tipo arbol b+
 
Arboles B y Arboles B+
Arboles B y Arboles B+Arboles B y Arboles B+
Arboles B y Arboles B+
 
Pilas como estructura de datos..
Pilas como estructura de datos..Pilas como estructura de datos..
Pilas como estructura de datos..
 
Aplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafosAplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafos
 
1 - Modelo Entidad Relacion
1 - Modelo Entidad Relacion1 - Modelo Entidad Relacion
1 - Modelo Entidad Relacion
 

5. arboles binarios

  • 1. Unidad 7  Árboles Binarios  •Biblio: “Algoritmos y Estructuras de datos” de Aguilar y Martinez. Unidad 14 y 15  •Autor: Ing Rolando Simon Titiosky.
  • 2. Árboles Generales  Intuitivamente el concepto de árbol implica  una estructura donde los datos se  organizan de modo que los elementos de  información estén relacionados entre sí a  través de ramas.  Definición recursiva: Árbol es un  conjunto de nodos que:  •  Es vacío, o bien,  •  Tiene un nodo raíz del que descienden  0 o más subárboles.
  • 3. Árboles Generales  •  Nodos: conjunto finito de  elementos.  15  •  Ramas: conjunto finito de líneas  dirigidas, que conectan  nodos.  •  Grado del Nodo: número de  6  20  ramas descendentes con un  nodo.  •  Raíz: primer nodo de un árbol no  4  10  17  22  vacío.  •  Camino: secuencia de nodos en  Raiz=15  los que c/nodo es adyacente al  siguiente.  Nodos: 15, 6, 20….  –  Solo existe 1 camino entre la Raíz y  Ramas(15, 6); (20, 17)  un Nodo cualquier.  –  La distancia de un Nodo a la Raíz  Grado del 15= G(15)=2  determina la rapidez de búsqueda.  G(10)=0; G(20)=2
  • 4. Terminología  A  Nivel 0  •  Padre: tiene Nodos sucesores.  •  Hijos: Nodos sucesores.  •  Descendientes: Hijos de los hijos  B  Nivel 1  C  •  Ascendientes: los padre y abuelos  de un nodo hijo.  •  Hermanos: 2 o mas nodos del  D  E  F  G  mismo padre.  •  Hojas: nodo sin hijos .  Nivel 2 •  Nivel de un nodo: distancia a la raíz.  •Padres: A; B y C.  •  Altura o profundidad de un árbol:  •Hijos: De A( B y C), de B (D y E)  nivel de la hoja del camino más largo  desde la raíz más uno.  •Descendentes de B: D y E  –  La altura de un árbol vacío es 0.  •Ascendientes de E: B y A.  •  Subárbol: cualquier estructura  •Hermano: {B, C}, {F, G}  conectada por debajo del raíz.  •Hojas: D, E, F, G  C/nodo de un árbol es la raíz de un  •Altura del Árbol: 3  subárbol que se define por el nodo y  •Altura del Subárbol de B: 2  todos los descendientes del nodo. 
  • 5. Equilibrio en Árbol Binario  •  Factor de Equilibrio: diferencia de altura  entre los 2 subárboles de un nodo.  – fe=h  –h  d  i.  – Árbol Equilibrado: –1<fe<1. Ej: fe=3–2=1  – Árbol Perfectamente Equilibrado: fe=0.  10  15  –1  0  4  17  6  20  0  0  0  1  6  15  20  4  10  17  22  Árbol Equilibrado Árbol  Perfectamente Equilibrado 
  • 6. Árbol Binario  •  Árbol donde ningún nodo puede tener mas de 2 subárboles.  n+1  •  En cualquier nivel n, solo puede contener de 1 a 2  –1 nodos  •  Árbol Completo: de Altura n  es un árbol en el que para c/nivel,  del 0 al n–1, está lleno de nodos. Todos los nodos hoja a nivel n  ocupan posiciones a la izquierda.  •  Árbol  Lleno: tiene el máximo número de entradas para su altura:  n.  k+1  2  A Nivel  k , tendrá 2  –1 nodos. (Nivel = Profundidad–1)  2+1  3  –  Lleno de Profundidad 3 = Nivel 2 => 2  –1 nodos= 2  –1= 7 nodos  •  Árbol Degenerado: hay un solo nodo hoja (el 18) y cada nodo no  hoja tiene solo un hijo. Equivalente a una lista enlazada.  20  15  15  5  5  20  9  9  10  10  32  32  6  6  20  20  12  4  4  15  15  31  31  45  45  12  18  18  1  1  6  6  4  4  10  10  17  17  22  22  Degenerado de profundidad 4  Completo de profundidad 4 Lleno de profundidad 3 
  • 7. TAD Árbol Binario: Especificación  •  Tipo de Dato  –  Nodos del Árbol (se especifica en filmina siguiente)  •  Operaciones  –  Altura: de un árbol  –  Borrar: Elimina del árbol a un nodo dado  –  Búsqueda: Buscar un elemento en un Árbol de Búsqueda  –  Construir: crea un árbol con un elemento raíz y dos ramas.  –  Copiar: crear una copia del árbol  –  CrearArbol: Inicia un árbol vacío  –  Derecho: da la rama derecha de un árbol dado.  –  Elementos: determina el número de elementos del árbol  –  EsVacio: comprueba si el árbol tiene nodos  –  Iguales: determinar si dos árboles son idénticos  –  Insertar: inserta un nodo dentro de un árbol  –  Izquierdo: da la rama izquierda de un árbol dado.  –  Pertenece: Determina si un elemento pertenece a un árbol.  –  Recorrer: el árbol de acuerdo algunos de los criterios  –  Profundidad: determina la profundidad de un árbol dado  –  Raiz:devuelve el nodo raíz.  –  ….
  • 8. Estructura de Datos  del Árbol Binario  Typedef int TipoElemento;  Typedef struct nodo  {  TipoElemento  dato;  struct nodo  *izq;  struct nodo  *der;  } Nodo;  Nodo Raíz A  A  Typedef Nodo* ArbolBinario;  B  B  C  C  D  D  null  E  null  E  null  null  F  null  F  null  null  G  null  G  null  null  null  null  H  null  H  null  null  null  I  null  I  null  null  N  null  N  null  null 
  • 9. Creación del Árbol  Void nuevoArbol(ArbolBinario* raíz, ArbolBinario ramaIzq,  TipoElemento x, ArbolBinario ramaDer)  {  *raiz=crearNodo(x);  (*raíz)–>izq=ramaIzq;  (*raíz)–>der=ramaDer;  }  raiz ArbolBinario crearNodo(TipoElemento x)  {  ArbolBinario a;  a  a=(ArbolBinario) malloc(sizeof(Nodo));  null  x  null  x  null  null  a.dato=x;  a.Izq=a.Der=NULL;  return a;  } 
  • 10. Ejemplo trivial  ArbolBinario raíz, a1, a2;  Void nuevoArbol(ArbolBinario* raíz,  Pila pila;  ArbolBinario ramaIzq, TipoElemento x,  nuevoArbol(&a1,NULL, “Maria”,NULL);  ArbolBinario ramaDer) nuevoArbol(&a2,NULL, “Rodrigo”,NULL);  nuevoArbol(&raiz,a1, “Esperanza”,a2);  Insertar(&pila, raíz);  nuevoArbol(&a1,NULL, “Any”,NULL);  nuevoArbol(&a2,NULL, “Abel”,NULL);  nuevoArbol(&raiz,a1, “Jesus”,a2);  Insertar(&pila, raíz);  a2=quitar(&pila);  a1=quitar(&pila);  nuevoArbol(&raiz,a1, “Esperanza”,a2);  Esperan  Esperan  raiz  za  za  Espera  Espera  Jesus  Jesus  a1  nza  nza  null  Maria  null  null  Maria null  null  Rodri  null  null  Rodri  null  null  null  Any  null  Any  null  null  Abel  null  null  Abel  null  a2  go  go 
  • 11. Recorrido del Árbol  •  Recorrer el Árbol significa que cada nodo sea procesado  una vez y solo una en un secuencia determinada.  Existen 2 enfoques generales  –  Recorrido en Profundidad: el proceso exige alcanzar las  profundidades de un camino desde la raíz hacia el descendiente  mas lejano del primer hijo, antes de proseguir con el segundo.  –  Recorrido en Anchura: el proceso se realiza horizontalmente  desde la raíz a todos su hijos antes de pasar con la  descendencia de alguno de ellos.  1  2  3  2  3  1  3  1  2  Preorden RID  EnOrden IRD  PostOrden IDR  Raiz–IZQ–DER  IZQ–Raiz–DER  IZQ–Raiz–DER
  • 12. Recorrido PreOrden (RID)  void preOrden(ArbolBinario raíz)  {  if(raiz)  {  visitar(raiz–>dato);  preOrden(raiz–>izq);  preOrden(raiz–>der);  }  void visitar(TipoElemento x)  }  {printf(“ %i ”, x);} El recorrido en PreOrden del  15  árbol es el siguiente:  15, 6, 4, 10, 20, 17, 22  6  20  4  10  17  22 
  • 13. Recorrido EnOrden (IRD)  void enOrden(ArbolBinario raíz)  {  if(raiz)  {  enOrden(raiz–>izq);  visitar(raiz–>dato);  enOrden(raiz–>der);  }  }  El recorrido en EnOrden del árbol  15  es el siguiente:  4, 6, 10, 15, 17, 20, 22 6  20  4  10  17  22 
  • 14. Recorrido PostOrden (IDR)  void PostOrden(ArbolBinario raíz)  {  if(raiz)  {  PostOrden(raiz–>izq);  PostOrden(raiz–>der);  visitar(raiz–>dato);  }  }  El recorrido en PostOrden del  15  árbol es el siguiente:  4, 10, 6, 17, 22, 20, 15 6  20  4  10  17  22 
  • 15. Comparemos Recorridos  •  PreOrden RID  18  –  18, 12, 5, 9, 28, 20, 35  •  EnOrden IRD  12  28  –  5, 9, 12, 18, 20, 28, 35  5  20  35  •  PostOrden IDR  –  9, 5, 12, 20, 35, 28, 18  9  Árbol Binario de Búsqueda  Como en el Ejemplo, dado un Nodo cualquiera del Árbol,  todos los datos de su Subárbol IZQ son menores, y los del  Subárbol DER son mayores: I<R<D: Por esto, solo el  recorrido IRD, dará la secuencia ordenada del árbol.
  • 16. Profundidad de un Árbol Binario  int profundidad (ArbolBinario raíz)  {  if (!raiz)  return 0 ; /*Árbol vacío*/  else  {  int profundidadI = profundidad (raiz ­> izq);  int profundidadD = profundidad (raíz ­> der);  if (profundidadI > profundidadD)  return profundidadI + 1;  else  return profundidadD + 1;  }  }  Altura o profundidad de un árbol: nivel de la hoja del camino más largo  desde la raíz más uno. La altura de un árbol vacío es 0.
  • 17. Creación de un Árbol  Binario de Búsqueda  •  Se desean almacenar los números 8, 3, 1, 20,  10, 5 y 4 en un Árbol Binario de Búsqueda.  •  La Única Regla es que I<R<D.  •  Inicialmente el Árbol está vacío y la única opción  para el 8 es ser el Nodo Raíz.  •  Luego viene 3, es menor a 8: va al subárbol IZQ  •  Luego el 1, menor al 8 y al 3.  8  8  x  8  8  8  8  3  3  3  3  y < x  Z > x 1  1 
  • 18. Creación de un Árbol  Binario de Búsqueda (cont.)  •  Se desean almacenar los números 8, 3, 1, 20, 10, 5 y 4  en un Árbol Binario de Búsqueda.  •  Luego el 20, mayor al 8  •  Así hasta insertar todos los elementos.  •  PROPIEDAD de los Árboles Binarios de Búsqueda:  –  No son únicos y depende del orden en el cual se fueron  insertando los elementos  8  8  8  8  8  8  8  8  3  3  20  20  3  3  20  20  3  3  3  3  20  20  20  20  1  1  1  1  5  5  10  10  1  1  10  10  1  1  10  10  5  5  4 4 
  • 19. Búsqueda en Árbol de Búsqueda  Nodo *buscar(Nodo *raiz, TipoElemento buscado)  {  if(!raiz)  return 0;  /*Árbol vacío*/  else  if (buscado==raiz–>dato) return raiz;  else  if (buscado<raiz–>dato)  return buscar(raiz–>izq, buscado);  else  return buscar(raiz–>der, buscado);  }
  • 20. Insertar en Árboles de Búsqueda  •  Es una extensión de la operación de Búsqueda  –  Si el árbol está vacío se inserta directamente  –  SINO: Buscará en el árbol el lugar correcto de Inserción  void insertar (Nodo** raiz, TipoElemento dato)  {  if (!(*raiz))  *raiz = crearNodo(dato);  else if (dato < (*raiz) ­> dato)  insertar (&((*raiz) ­> izdo), dato);  else  insertar (&((*raiz) ­> dcho), dato);  }
  • 21. Eliminar de un Árbol Binario de Búsqueda  •  Es una extensión de la operación de búsqueda.  •  Mantendrá la estructura de Árbol Binario de  Búsqueda.  •  Presenta 2 casos bien diferenciados  –  1er: El Nodo a eliminar es Hoja o Hijo único  •  Se Asignará al Padre del nodo a eliminar, su único  descendiente. (El Abuelo se encargará del Nieto)  –  2do: El nodo a borrar tiene sus dos hijos. Se Puede  •  Reemplazar el dato del nodo con el Menor de las Claves  Mayores del Subárbol Derecho.  •  Reemplazar el dato del nodo con el Mayor de las Claves  Menores del Subárbol Izquierdo.  –  Bajaremos al 1er nodo de la Rama Izquierda  –  Como la clave mayor está a la derecha, se continúa bajando a  derecha hasta encontrar un nodo hoja (El Mayor de los  Menores que reemplazará el dato a eliminar).
  • 22. Eliminar de un Árbol Binario de  Búsqueda  8  8  •  Eliminar el Nodo 8.  3  3  20  20  1  1  10  10  •  Bajaremos al 1er nodo de la  5  5  Rama Izquierda: Nodo 3  4  4  •  Como la clave mayor está a su  5  5  derecha, se continúa bajando a  3  3  20  20  derecha hasta encontrar un  1  1  ??   ??  10  10  nodo sin rama DER: El nodo 5.  4  4  •  Se reemplaza el 8 por el 5.  5 5  •  Queda un caso de Hijo Único.  3  3  20  20  •  El Abuelo (3) se encargará del  1  1  4  4  10  10  Nieto (4). 
  • 23. Eliminar de un Árbol Binario de Búsqueda  void reemplazar(Nodo** act)  void eliminar (Nodo** r, TipoElemento  {  Nodo* a, *p;  dato)  p = *act;  {  if (!(*r)) puts("Nodo no encontrado");  a = (*act) ­> izdo;/* menores a IZQ*/  else if (dato < (*r) ­> dato)  while (a ­> dcho)  eliminar(&(*r) ­> izdo, dato);  {  p = a; /* buscamos el Mayor a DER*/  else if (dato > (*r) ­> dato)  a = a ­> dcho;  eliminar(&(*r) ­> dcho,dato);  }  else  /* Nodo encontrado */  {  Nodo* q; /* puntero al nodo a suprimir */  ;/* Cambio de Campo Datos*/  q = (*r);  /* r es el ptr del nodo Padre */  (*act) ­> dato = a ­> dato;  /* Al Abuelo p, se hace cargo de nieto IZQ*/  if (q ­> izdo == NULL)  (*r) = q ­> dcho;  if (p == (*act))  else if (q ­> dcho == NULL)  p ­> izdo = a ­> izdo;  (*r) = q ­> izdo;  else  else /* tiene rama izquierda y derecha */  p ­> dcho = a ­> izdo;  reemplazar(&q);  (*act) = a;  free(q);  } /* Ojo: No puede tener nada a Derecha,  pues abríamos bajado en el while.*/ }  } 
  • 24. AVL:  Árbol Binario  Ordenado y Balanceado  •  Considerando a un árbol de n nodos.  –  Eficiencia en Búsquedas en árboles Equilibrados F(n)=Log n  –  En los demás: log n <= F(n) <=n  •  Para Optimizar las Búsquedas, se intentará mantener  los Árboles Binarios Ordenados I<R<D y Equilibrados.  –  Llamados Árboles AVL  (Adelson–Velskii–Landis)  –  Se caracterizan porque la Altura B=h  –h  : –1<=B<=1  d  i  –  Restringe la altura de cada uno de los Subárboles  –  Se necesita un campo “FE” (Factor de Equilibrio) en cada nodo.  struct nodo  {  TipoElemento  dato;  int fe;  struct nodo  *izq, *der;  } Nodo;
  • 25. Inserción en AVL  •  La Inserción se hace siguiendo el camino de búsqueda  •  Puede aumentar la altura de una rama, de manera que  cambie el factor de equilibrio de dicho nodo.  –  Implica que se retornará por el camino de búsqueda para  actualizar el FE de c/nodo  –  Se puede llegar a Desbalancear (Altura=2) => ReBalanceo.  –  O Puede mejorar: Si al Árbol X se le Inserta el 3, resultará en  Perfectamente Balanceado.  •  El Proceso termina cuando se llega a la Raiz o cuando  termina el Rebalanceo del mismo.  h IZQ  h DER  h IZQ  h DER  3  10  3  4  10  10  3  0  –1  4  17  3  4  4  17  17  2  2  0  2  2  0  1  2  6  6  15  15  20  20  1 1  6  15  20  1  –1  0  0  0  0  0  5  Árbol x + Nodo 5  Árbol x  1  5 
  • 26. Reestructuración AVL  Hay 4 casos posibles a tener en cuenta, según donde se  hizo la Inserción.  A  A  A  A  1. Inserción en el  2. Inserción en el Subárbol DER  Subárbol IZQ De la  De la Rama IZQ de A  Rama IZQ de A  A  A  3. Inserción  en el Subárbol  A  A  4. Inserción en el Subárbol  DER  DER De la Rama IZQ de A  De la Rama DER de A  •  Solución: La ROTACION le devuelve el equilibrio al árbol.  –  Rotación Simple: Caso 1 y 3: Implica a A y su descendiente  –  Rotación Doble: Caso 2 y 4: Implica a los 3 nodos  •  Soluciones simétricas: En c/caso, las ramas están  opuestas.
  • 27. AVL: Rotación Simple  •  Luego de Insertar el Nodo A el árbol quedó  n  –2  desbalanceado.  n1  C  C  •  Según que rama ha crecido, la Rotación  Simple puede ser de izquierda–izquierda (II)  B  B  –1  o derecha–derecha(DD).  A  A  •  Movimientos de Ptrs.  0  –  n es ptro al nodo problema: Fe=­2  –  IZQ (nuestro ej). N1 apunta a rama IZQ  n •  n­>izq=n1–>der  n1  0  •  n1­>der=n  B  B  •  n=n1  0  A  A  –  DER. N1 apunta a rama DER  C  C  •  n­>der=n1–>izq  0  •  n1­>izq=n  •  n=n1 
  • 28. AVL: Rotación Doble  Movimientos de Ptrs.  •  n apunta al nodo problema (Fe=­2); n1 al  hijo de n con problemas, n2 al hijo de n1  •  DI(nuestro ej). Derecha–izquierda  –  n1­>izq=n2–>der  La solución consiste  –  n2–>der=n1  en subir el 40, pender  el 30 a su izquierda y  –  n­>der=n2–>izq  el 60 a su derecha.  –  n2–>izq=n  –  n=n2  n  •  ID: izquierda–derecha  2  30  30  –  n1­>der=n2–>izq  –  n2–>izq=n1  n2  n1  n1  60  60  –  n­>izq=n2–>der  40  40  –1  40  40  n2  –  n2–>der=n  –  n=n2  0  30  30  60  n 60 
  • 29. Eliminación de un Nodo AVL  •  Luego de eliminar un nodo con cierta clave, el  árbol resultante debe seguir siendo AVL  •  El Algoritmo puede descomponerse en dos  partes bien diferenciadas  1.  Eliminar el Nodo: según la estrategia que vimos en  la Eliminación de Nodo en Árbol de Búsqueda  2.  Balancear: se debe seguir el camino de búsqueda  en sentido inverso:  2.1. Arreglando el Factor de Equilibrio  2.1. Restaurar el Equilibrio allí donde se rompe.
  • 30. Trabajos Prácticos Unidad 7  COMO MINIMO, REALIZAR:  •  De la Bibliografía  –  Del Capitulo 14:  •  Ejercicios: 14.1 al 14.8, 14.11  •  Problemas: 14.2, 14.3, 14.7  –  Del Capitulo 15:  •  Ejercicios:15.1, 15.6, 15.10  •  Problemas: 15.1  •  Complementarios:  –  Equilibrar los Árboles de 14.1 al 14.8, 14.11