SlideShare une entreprise Scribd logo
1  sur  17
ÁRBOL AVL
Diego Márquez De La Hoz
Ingeniería de Sistemas
Descripción
   "Un algoritmo para la organización de la
    información“.(Adelson-Velskii y Landis)
   Están siempre equilibrados. Es decir, 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 o viceversa.
   La complejidad de una búsqueda se mantiene
    siempre en orden de complejidad O(log n).
   Para conseguir la propiedad de equilibrio, la
    inserción y el borrado de los nodos se ha de
    realizar de una forma especial. Si no se preserva
    esta propiedad, hay que realizar una serie de
    rotaciones de los nodos.
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
OPERACIONES
Rotación simple a la derecha
   De un árbol de raíz (r) y
    de hijos izq. (i) y
    der.(d), se formara un
    nuevo árbol cuya raíz
    sea la raíz del hijo
    izq., como hijo izq.
    colocamos el hijo izq.
    de i (i’) y como hijo der.
    construimos un nuevo
    árbol que tendrá como
    raíz, la raíz del árbol
    (r), el hijo der. de i (d’)
    será el hijo izq. y el hijo
    der.     será    el    hijo
    derecho del árbol (d).
Rotación simple a la
izquierda
   De un árbol de raíz (r) y
    de hijos izq. (i) y der.
    (d), se formara un
    nuevo árbol cuya raíz
    sea la raíz del hijo
    der., como hijo der.
    colocamos el hijo der.
    de d (d’) y como hijo
    izquierdo construimos
    un nuevo árbol que
    tendrá como raíz la raíz
    del árbol (r), el hijo izq.
    de d será el hijo
    derecho (i’) y el hijo izq.
    será el hijo izq. del
    árbol (i).
Inserción
   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
     2. insertar el nuevo nodo con factor de equilibrio

     3. repasar el camino de búsqueda, verificando el
      equilibrio de los nodos, y re-equilibrando si es
      necesario
Extracción
   Una extracción trae 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 en
    cuestión, pudiendo necesitarse una rotación.
Borrar A, y la nueva raíz será M.




Borrado A, la nueva raíz es M.
Aplicamos la rotación a la derecha.




                   El árbol resultante ha perdido altura.
CÓDIGO EN JAVA
Class AvlNode
/**
*
* @author Diego
*/
public class AVLNode {


      public Comparable dato;                   // el dato del nodo
      public AVLNode izquierdo;                 // hijo izquierdo
      public AVLNode derecho;                   // hijo derecho
      public int height;                 // altura


      // Constructors
      public AVLNode(Comparable dato) {
          this(dato, null, null);
      }


      public AVLNode(Comparable dato, AVLNode izq, AVLNode der) {
          this.dato = dato;
          this.izquierdo = izq;
          this.derecho = der;
          height = 0;               // altura predeterminada
      }
}
Class AvlTree
public class AVLTree {                                               private static int max(int izquierdaHeight, int derechaHeight) {
  private AVLNode root;                                                    return izquierdaHeight > derechaHeight ? izquierdaHeight : derechaHeight;
                                                                       }
  public void insert(Comparable x) {
        root = insertar(x, root);                                      private static AVLNode rotacionHijoIzquierdo(AVLNode t) {
  }                                                                        AVLNode aux2 = t.izquierdo;
                                                                           t.izquierdo = aux2.derecho;
  /*                                                                       aux2.derecho = t;
   * x es una instancia de una clase que implementa Comparable             t.height = max(height(t.izquierdo), height(t.derecho)) + 1;
   */                                                                      aux2.height = max(height(aux2.izquierdo), t.height) + 1;
  private AVLNode insertar(Comparable x, AVLNode t) {                      return aux2;
        if (t == null) {                                               }
           t = new AVLNode(x, null, null);
        } else if (x.compareTo(t.dato) < 0) {                          private static AVLNode rotacionHijoDerecho(AVLNode t) {
           t.izquierdo = insertar(x, t.izquierdo);                         AVLNode aux2 = t.derecho;
           if (height(t.izquierdo) - height(t.derecho) == 2) {             t.derecho = aux2.izquierdo;
               if (x.compareTo(t.izquierdo.dato) < 0) {                    aux2.izquierdo = t;
                   t = rotacionHijoIzquierdo(t); /* Caso 1 */              t.height = max(height(t.izquierdo), height(t.derecho)) + 1;
               } else {                                                    aux2.height = max(height(aux2.derecho), t.height) + 1;
                   t = rotacionDobleHijoIzquierda(t); /* Caso 2 */         return aux2;
               }                                                       }
           }
        } else if (x.compareTo(t.dato) > 0) {
           t.derecho = insertar(x, t.derecho);
           if (height(t.derecho) - height(t.izquierdo) == 2) {
               if (x.compareTo(t.derecho.dato) > 0) {
                   t = rotacionHijoDerecho(t); /* Caso 4 */
               } else {
                   t = rotacionDobleHijoDerecho(t); /* Caso 3 */
               }
private static AVLNode rotacionDobleHijoIzquierda(AVLNode aux) {
          aux.izquierdo = rotacionHijoDerecho(aux.izquierdo);              private void imprimir(AVLNode nodo) {
          return rotacionHijoIzquierdo(aux);                                    if (nodo != null) {
     }                                                                              imprimir(nodo.derecho);
                                                                                    System.out.println("[" + nodo.dato + "]");
     private static AVLNode rotacionDobleHijoDerecho(AVLNode aux) {                 imprimir(nodo.izquierdo);
          aux.derecho = rotacionHijoIzquierdo(aux.derecho);                     }
          return rotacionHijoDerecho(aux);                                 }
     }
                                                                           public void imprimirPorAltura() {
     private static int height(AVLNode t) {                                     imprimirPorltura(root);
          return t == null ? -1 : t.height;                                }
     }                                                                /*
/*                                                                         * Imprime cada nodo linea por linea. Recorriendo el arbol desde
     * Imprime el arbol con el recorrido InOrden                           * el Nodo más a la derecha hasta el nodo más a la izquierda,
     */                                                                    * y dejando una identacion de varios espacios en blanco segun su
     public void imprimir() {                                              * altura en el arbol
          imprimir(root);                                                  */
     }                                                                     private void imprimirPorltura(AVLNode nodo) {
                                                                                if (nodo != null) {
                                                                                    imprimirPorltura(nodo.derecho);
                                                                                    System.out.println(replicate(" ", height(root) - height(nodo)) + "[" + nodo.dato + "]");
                                                                                    imprimirPorltura(nodo.izquierdo);
                                                                                }
                                                                           }
/*                                                                                                     // Imprime el arbol por niveles. Comienza por la raiz.
     * Metodo estatico auxiliar que dada una cadena a y un enterto cnt                                   public void imprimirPorNiveles() {
     * replica o concatena esa cadena a, cnt veces                                                           imprimirPorNiveles(root);
     */                                                                                                  }
     private static String replicate(String a, int cnt) {
          String x = new String("");                                                                     // Imprime el arbol por niveles.
                                                                                                         private void imprimirPorNiveles(AVLNode nodo) {
          for (int i = 0; i < cnt; i++) {                                                                    // Mediante la altura calcula el total de nodos posibles del árbol
              x = x + a;                                                                                     // Y crea una array cola con ese tamaño
          }                                                                                                  int max = 0;
          return x;                                                                                          int nivel = calcularAltura();
     }
                                                                                                             for (; nivel >= 0; nivel--) {
     /*                                                                                                          max += Math.pow(2, nivel);
     * Obtiene la altura del arbol AVL                                                                       }
     */                                                                                                      max++;       // Suma 1 para no utilizar la posicion 0 del array
     public int calcularAltura() {
          return calcularAltura(root);                                                                       AVLNode cola[] = new AVLNode[max];
     }
                                                                                                             // Carga en la pos 1 el nodo raiz
     private int calcularAltura(AVLNode actual) {                                                            cola[1] = nodo;
          if (actual == null) {                                                                              int x = 1;
              return -1;
          } else {
              return 1 + Math.max(calcularAltura(actual.izquierdo), calcularAltura(actual.derecho));
          }
     }
// Carga los demas elementos del arbol,
    // Carga null en izq y der si el nodo es null                                                          if (cola[i] != null) {
    // i aumenta de a 2 por q carga en izq y der los hijos                                                     System.out.print("[" + cola[i].dato + "]");
    // x aumenta 1, que son los nodos raiz - padre                                                             cont++;
    for (int i = 2; i < max; i += 2, x++) {                                                                }
        if (cola[x] == null) {                                                                             if (ultimaPosicion == i && cantidad == Math.pow(2, --nivel)) {
            cola[i] = null;                                                                                    if (cantidad == 1) {
            cola[i + 1] = null;                                                                                    System.out.print(" Cantidad de nodos: " + cont + " (raiz)");
        } else {                                                                                               } else {
            cola[i] = cola[x].izquierdo;                                                                           System.out.print(" Cantidad de nodos: " + cont);
            cola[i + 1] = cola[x].derecho;                                                                     }
        }                                                                                                      cont = 0;
    }                                                                                                          cantidad *= 2;
    nivel = 0;                                                                                                 ultimaPosicion += (int) Math.pow(2, ++nivel);
    int cont = 0;                  // contador para cada nivel                                             }
    int cantidad = 1;                 // cantidad de nodos por nivel                                   }
    int ultimaPosicion = 1;              // ultimaPosicion del nodo en la cola de cada nivel       }
                                                                                               }
    // Cuando i es = a 2^nivel hay cambio de nivel
    // 2 ^ 0 = 1 que es el nodo raiz
    for (int i = 1; i < max; i++) {
        if (i == Math.pow(2, nivel)) {
            // Nodo raiz tiene nivel 1, por eso (nivel + 1)
            System.out.print("n Nivel " + (nivel) + ": ");
            nivel++;
        }
Class EjecutableAvlTree
/**                                                   arbolAVL.insert(elemento1);
*                                                             arbolAVL.insert(elemento2);
* @author Diego                                               arbolAVL.insert(elemento3);
*/                                                            arbolAVL.insert(elemento4);
public class EjecutableAVLTree {                              arbolAVL.insert(elemento5);
                                                              arbolAVL.insert(elemento6);
      /**                                                     arbolAVL.insert(elemento7);
      * @param args the command line arguments                arbolAVL.insert(elemento8);
      */                                                      arbolAVL.insert(elemento9);
      public static void main(String[] args) {                arbolAVL.insert(elemento10);
            // TODO code application logic here
            AVLTree arbolAVL = new AVLTree();                 arbolAVL.imprimirPorNiveles();


            Integer elemento1 = new Integer("1");             int altura = arbolAVL.calcularAltura() + 1;
            Integer elemento2 = new Integer("2");
            Integer elemento3 = new Integer("3");             System.out.println("n");
            Integer elemento4 = new Integer("4");             System.out.println(altura + " altura del arbol");
            Integer elemento5 = new Integer("5");             System.out.println("n");
            Integer elemento6 = new Integer("6");
            Integer elemento7 = new Integer("7");             arbolAVL.imprimirPorAltura();
            Integer elemento8 = new Integer("15");
            Integer elemento9 = new Integer("14");
            Integer elemento10 = new Integer("13");


                                                          }
                                                      }

Contenu connexe

Tendances

Listas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPListas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPMiguelGomez371
 
Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: ListaEmerson Garay
 
Ordenamiento en C++
Ordenamiento en C++Ordenamiento en C++
Ordenamiento en C++compumet sac
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos Kaneki04
 
Arboles En Estructura de Datos
Arboles En Estructura de DatosArboles En Estructura de Datos
Arboles En Estructura de DatosDARKGIRL93
 
Función Hash: metodos de división y de medio Cuadrado.
Función Hash: metodos de división y de medio Cuadrado.Función Hash: metodos de división y de medio Cuadrado.
Función Hash: metodos de división y de medio Cuadrado.Ana Castro
 
Teoria de grafos. introducción
Teoria de grafos. introducciónTeoria de grafos. introducción
Teoria de grafos. introducciónAlejandra Guzman
 
Ejercicio sql tienda informatica (1)
Ejercicio sql tienda informatica (1)Ejercicio sql tienda informatica (1)
Ejercicio sql tienda informatica (1)Jsrfs Montemayor
 
Exposicion Busqueda
Exposicion BusquedaExposicion Busqueda
Exposicion BusquedaAngie Suarez
 
Heap sort (Monticulos)
Heap sort (Monticulos)Heap sort (Monticulos)
Heap sort (Monticulos)leidy2220
 

Tendances (20)

Listas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UPListas doblemente enlazadas C++ UP
Listas doblemente enlazadas C++ UP
 
Ordenamiento parte 2
Ordenamiento parte 2Ordenamiento parte 2
Ordenamiento parte 2
 
Metodo burbuja
Metodo burbujaMetodo burbuja
Metodo burbuja
 
Estructura de Datos: Lista
Estructura de Datos: ListaEstructura de Datos: Lista
Estructura de Datos: Lista
 
Listas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de DatosListas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de Datos
 
Ordenamiento en C++
Ordenamiento en C++Ordenamiento en C++
Ordenamiento en C++
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Arboles En Estructura de Datos
Arboles En Estructura de DatosArboles En Estructura de Datos
Arboles En Estructura de Datos
 
Estructura datos pilas y colas
Estructura datos pilas y colasEstructura datos pilas y colas
Estructura datos pilas y colas
 
Lista circulares doblemente enlazadas
Lista circulares doblemente enlazadasLista circulares doblemente enlazadas
Lista circulares doblemente enlazadas
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colas
 
Función Hash: metodos de división y de medio Cuadrado.
Función Hash: metodos de división y de medio Cuadrado.Función Hash: metodos de división y de medio Cuadrado.
Función Hash: metodos de división y de medio Cuadrado.
 
Teoria de grafos. introducción
Teoria de grafos. introducciónTeoria de grafos. introducción
Teoria de grafos. introducción
 
Ejercicio sql tienda informatica (1)
Ejercicio sql tienda informatica (1)Ejercicio sql tienda informatica (1)
Ejercicio sql tienda informatica (1)
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Exposicion Busqueda
Exposicion BusquedaExposicion Busqueda
Exposicion Busqueda
 
Arboles multicamino
Arboles  multicaminoArboles  multicamino
Arboles multicamino
 
Árboles binarios, ABB y AVL
Árboles binarios, ABB y AVLÁrboles binarios, ABB y AVL
Árboles binarios, ABB y AVL
 
Heap sort (Monticulos)
Heap sort (Monticulos)Heap sort (Monticulos)
Heap sort (Monticulos)
 

Similaire à arboles avl con codigo en java

S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminación
S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminaciónS7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminación
S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminaciónLuis Fernando Aguas Bucheli
 
Lista enlazada 2 parcial
Lista enlazada 2 parcialLista enlazada 2 parcial
Lista enlazada 2 parcialCerdorock
 
Estructura de datos I Primera Parte
Estructura de datos I Primera ParteEstructura de datos I Primera Parte
Estructura de datos I Primera Partecarpio
 
Apuntes Nº4 (TDA Estructuras Lineales).pptx
Apuntes Nº4 (TDA Estructuras Lineales).pptxApuntes Nº4 (TDA Estructuras Lineales).pptx
Apuntes Nº4 (TDA Estructuras Lineales).pptxCamilaCabrera47
 
gráficas 2D y 3D (José Ponce)
gráficas 2D y 3D (José  Ponce)gráficas 2D y 3D (José  Ponce)
gráficas 2D y 3D (José Ponce)José Ponce
 
Estructuras dinamicas ppt
Estructuras dinamicas pptEstructuras dinamicas ppt
Estructuras dinamicas pptAby Castillo
 
Lab 03 - Análisis de Señales - UNTECS
Lab 03 - Análisis de Señales - UNTECSLab 03 - Análisis de Señales - UNTECS
Lab 03 - Análisis de Señales - UNTECSIng. Electrónica xD
 

Similaire à arboles avl con codigo en java (11)

S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminación
S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminaciónS7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminación
S7-EDD-4.1 Representación y operaciones: Inserción, recorridos, eliminación
 
Lista enlazada 2 parcial
Lista enlazada 2 parcialLista enlazada 2 parcial
Lista enlazada 2 parcial
 
Arboles
ArbolesArboles
Arboles
 
Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Programación de código
Programación de códigoProgramación de código
Programación de código
 
Estructura de datos I Primera Parte
Estructura de datos I Primera ParteEstructura de datos I Primera Parte
Estructura de datos I Primera Parte
 
NOTACIÓN POSTFIJA E INFIJA - JAVA
NOTACIÓN POSTFIJA E INFIJA - JAVANOTACIÓN POSTFIJA E INFIJA - JAVA
NOTACIÓN POSTFIJA E INFIJA - JAVA
 
Apuntes Nº4 (TDA Estructuras Lineales).pptx
Apuntes Nº4 (TDA Estructuras Lineales).pptxApuntes Nº4 (TDA Estructuras Lineales).pptx
Apuntes Nº4 (TDA Estructuras Lineales).pptx
 
gráficas 2D y 3D (José Ponce)
gráficas 2D y 3D (José  Ponce)gráficas 2D y 3D (José  Ponce)
gráficas 2D y 3D (José Ponce)
 
Estructuras dinamicas ppt
Estructuras dinamicas pptEstructuras dinamicas ppt
Estructuras dinamicas ppt
 
Lab 03 - Análisis de Señales - UNTECS
Lab 03 - Análisis de Señales - UNTECSLab 03 - Análisis de Señales - UNTECS
Lab 03 - Análisis de Señales - UNTECS
 

Dernier

MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxRAMON EUSTAQUIO CARO BAYONA
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialpatriciaines1993
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfAlfredoRamirez953210
 
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docxEDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docxLuisAndersonPachasto
 
05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdfRAMON EUSTAQUIO CARO BAYONA
 
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDUFICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDUgustavorojas179704
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxMonitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxJUANCARLOSAPARCANARE
 
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...fcastellanos3
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxEribertoPerezRamirez
 
cuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicacuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicaGianninaValeskaContr
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxYeseniaRivera50
 
Contextualización y aproximación al objeto de estudio de investigación cualit...
Contextualización y aproximación al objeto de estudio de investigación cualit...Contextualización y aproximación al objeto de estudio de investigación cualit...
Contextualización y aproximación al objeto de estudio de investigación cualit...Angélica Soledad Vega Ramírez
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressionsConsueloSantana3
 

Dernier (20)

MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundial
 
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdfEstrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
Estrategias de enseñanza - aprendizaje. Seminario de Tecnologia..pptx.pdf
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docxEDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
 
05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf
 
DIA INTERNACIONAL DAS FLORESTAS .
DIA INTERNACIONAL DAS FLORESTAS         .DIA INTERNACIONAL DAS FLORESTAS         .
DIA INTERNACIONAL DAS FLORESTAS .
 
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDUFICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
 
recursos naturales america cuarto basico
recursos naturales america cuarto basicorecursos naturales america cuarto basico
recursos naturales america cuarto basico
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptxMonitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
Monitoreo a los coordinadores de las IIEE JEC_28.02.2024.vf.pptx
 
La luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luzLa luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luz
 
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
 
cuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicacuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básica
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
 
Contextualización y aproximación al objeto de estudio de investigación cualit...
Contextualización y aproximación al objeto de estudio de investigación cualit...Contextualización y aproximación al objeto de estudio de investigación cualit...
Contextualización y aproximación al objeto de estudio de investigación cualit...
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressions
 
PPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptxPPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptx
 

arboles avl con codigo en java

  • 1. ÁRBOL AVL Diego Márquez De La Hoz Ingeniería de Sistemas
  • 2. Descripción  "Un algoritmo para la organización de la información“.(Adelson-Velskii y Landis)  Están siempre equilibrados. Es decir, 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 o viceversa.  La complejidad de una búsqueda se mantiene siempre en orden de complejidad O(log n).  Para conseguir la propiedad de equilibrio, la inserción y el borrado de los nodos se ha de realizar de una forma especial. Si no se preserva esta propiedad, hay que realizar una serie de rotaciones de los nodos.
  • 3. 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
  • 5. Rotación simple a la derecha  De un árbol de raíz (r) y de hijos izq. (i) y der.(d), se formara un nuevo árbol cuya raíz sea la raíz del hijo izq., como hijo izq. colocamos el hijo izq. de i (i’) y como hijo der. construimos un nuevo árbol que tendrá como raíz, la raíz del árbol (r), el hijo der. de i (d’) será el hijo izq. y el hijo der. será el hijo derecho del árbol (d).
  • 6. Rotación simple a la izquierda  De un árbol de raíz (r) y de hijos izq. (i) y der. (d), se formara un nuevo árbol cuya raíz sea la raíz del hijo der., como hijo der. colocamos el hijo der. de d (d’) y como hijo izquierdo construimos un nuevo árbol que tendrá como raíz la raíz del árbol (r), el hijo izq. de d será el hijo derecho (i’) y el hijo izq. será el hijo izq. del árbol (i).
  • 7. Inserción  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  2. insertar el nuevo nodo con factor de equilibrio  3. repasar el camino de búsqueda, verificando el equilibrio de los nodos, y re-equilibrando si es necesario
  • 8.
  • 9. Extracción  Una extracción trae 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 en cuestión, pudiendo necesitarse una rotación.
  • 10. Borrar A, y la nueva raíz será M. Borrado A, la nueva raíz es M. Aplicamos la rotación a la derecha. El árbol resultante ha perdido altura.
  • 12. Class AvlNode /** * * @author Diego */ public class AVLNode { public Comparable dato; // el dato del nodo public AVLNode izquierdo; // hijo izquierdo public AVLNode derecho; // hijo derecho public int height; // altura // Constructors public AVLNode(Comparable dato) { this(dato, null, null); } public AVLNode(Comparable dato, AVLNode izq, AVLNode der) { this.dato = dato; this.izquierdo = izq; this.derecho = der; height = 0; // altura predeterminada } }
  • 13. Class AvlTree public class AVLTree { private static int max(int izquierdaHeight, int derechaHeight) { private AVLNode root; return izquierdaHeight > derechaHeight ? izquierdaHeight : derechaHeight; } public void insert(Comparable x) { root = insertar(x, root); private static AVLNode rotacionHijoIzquierdo(AVLNode t) { } AVLNode aux2 = t.izquierdo; t.izquierdo = aux2.derecho; /* aux2.derecho = t; * x es una instancia de una clase que implementa Comparable t.height = max(height(t.izquierdo), height(t.derecho)) + 1; */ aux2.height = max(height(aux2.izquierdo), t.height) + 1; private AVLNode insertar(Comparable x, AVLNode t) { return aux2; if (t == null) { } t = new AVLNode(x, null, null); } else if (x.compareTo(t.dato) < 0) { private static AVLNode rotacionHijoDerecho(AVLNode t) { t.izquierdo = insertar(x, t.izquierdo); AVLNode aux2 = t.derecho; if (height(t.izquierdo) - height(t.derecho) == 2) { t.derecho = aux2.izquierdo; if (x.compareTo(t.izquierdo.dato) < 0) { aux2.izquierdo = t; t = rotacionHijoIzquierdo(t); /* Caso 1 */ t.height = max(height(t.izquierdo), height(t.derecho)) + 1; } else { aux2.height = max(height(aux2.derecho), t.height) + 1; t = rotacionDobleHijoIzquierda(t); /* Caso 2 */ return aux2; } } } } else if (x.compareTo(t.dato) > 0) { t.derecho = insertar(x, t.derecho); if (height(t.derecho) - height(t.izquierdo) == 2) { if (x.compareTo(t.derecho.dato) > 0) { t = rotacionHijoDerecho(t); /* Caso 4 */ } else { t = rotacionDobleHijoDerecho(t); /* Caso 3 */ }
  • 14. private static AVLNode rotacionDobleHijoIzquierda(AVLNode aux) { aux.izquierdo = rotacionHijoDerecho(aux.izquierdo); private void imprimir(AVLNode nodo) { return rotacionHijoIzquierdo(aux); if (nodo != null) { } imprimir(nodo.derecho); System.out.println("[" + nodo.dato + "]"); private static AVLNode rotacionDobleHijoDerecho(AVLNode aux) { imprimir(nodo.izquierdo); aux.derecho = rotacionHijoIzquierdo(aux.derecho); } return rotacionHijoDerecho(aux); } } public void imprimirPorAltura() { private static int height(AVLNode t) { imprimirPorltura(root); return t == null ? -1 : t.height; } } /* /* * Imprime cada nodo linea por linea. Recorriendo el arbol desde * Imprime el arbol con el recorrido InOrden * el Nodo más a la derecha hasta el nodo más a la izquierda, */ * y dejando una identacion de varios espacios en blanco segun su public void imprimir() { * altura en el arbol imprimir(root); */ } private void imprimirPorltura(AVLNode nodo) { if (nodo != null) { imprimirPorltura(nodo.derecho); System.out.println(replicate(" ", height(root) - height(nodo)) + "[" + nodo.dato + "]"); imprimirPorltura(nodo.izquierdo); } }
  • 15. /* // Imprime el arbol por niveles. Comienza por la raiz. * Metodo estatico auxiliar que dada una cadena a y un enterto cnt public void imprimirPorNiveles() { * replica o concatena esa cadena a, cnt veces imprimirPorNiveles(root); */ } private static String replicate(String a, int cnt) { String x = new String(""); // Imprime el arbol por niveles. private void imprimirPorNiveles(AVLNode nodo) { for (int i = 0; i < cnt; i++) { // Mediante la altura calcula el total de nodos posibles del árbol x = x + a; // Y crea una array cola con ese tamaño } int max = 0; return x; int nivel = calcularAltura(); } for (; nivel >= 0; nivel--) { /* max += Math.pow(2, nivel); * Obtiene la altura del arbol AVL } */ max++; // Suma 1 para no utilizar la posicion 0 del array public int calcularAltura() { return calcularAltura(root); AVLNode cola[] = new AVLNode[max]; } // Carga en la pos 1 el nodo raiz private int calcularAltura(AVLNode actual) { cola[1] = nodo; if (actual == null) { int x = 1; return -1; } else { return 1 + Math.max(calcularAltura(actual.izquierdo), calcularAltura(actual.derecho)); } }
  • 16. // Carga los demas elementos del arbol, // Carga null en izq y der si el nodo es null if (cola[i] != null) { // i aumenta de a 2 por q carga en izq y der los hijos System.out.print("[" + cola[i].dato + "]"); // x aumenta 1, que son los nodos raiz - padre cont++; for (int i = 2; i < max; i += 2, x++) { } if (cola[x] == null) { if (ultimaPosicion == i && cantidad == Math.pow(2, --nivel)) { cola[i] = null; if (cantidad == 1) { cola[i + 1] = null; System.out.print(" Cantidad de nodos: " + cont + " (raiz)"); } else { } else { cola[i] = cola[x].izquierdo; System.out.print(" Cantidad de nodos: " + cont); cola[i + 1] = cola[x].derecho; } } cont = 0; } cantidad *= 2; nivel = 0; ultimaPosicion += (int) Math.pow(2, ++nivel); int cont = 0; // contador para cada nivel } int cantidad = 1; // cantidad de nodos por nivel } int ultimaPosicion = 1; // ultimaPosicion del nodo en la cola de cada nivel } } // Cuando i es = a 2^nivel hay cambio de nivel // 2 ^ 0 = 1 que es el nodo raiz for (int i = 1; i < max; i++) { if (i == Math.pow(2, nivel)) { // Nodo raiz tiene nivel 1, por eso (nivel + 1) System.out.print("n Nivel " + (nivel) + ": "); nivel++; }
  • 17. Class EjecutableAvlTree /** arbolAVL.insert(elemento1); * arbolAVL.insert(elemento2); * @author Diego arbolAVL.insert(elemento3); */ arbolAVL.insert(elemento4); public class EjecutableAVLTree { arbolAVL.insert(elemento5); arbolAVL.insert(elemento6); /** arbolAVL.insert(elemento7); * @param args the command line arguments arbolAVL.insert(elemento8); */ arbolAVL.insert(elemento9); public static void main(String[] args) { arbolAVL.insert(elemento10); // TODO code application logic here AVLTree arbolAVL = new AVLTree(); arbolAVL.imprimirPorNiveles(); Integer elemento1 = new Integer("1"); int altura = arbolAVL.calcularAltura() + 1; Integer elemento2 = new Integer("2"); Integer elemento3 = new Integer("3"); System.out.println("n"); Integer elemento4 = new Integer("4"); System.out.println(altura + " altura del arbol"); Integer elemento5 = new Integer("5"); System.out.println("n"); Integer elemento6 = new Integer("6"); Integer elemento7 = new Integer("7"); arbolAVL.imprimirPorAltura(); Integer elemento8 = new Integer("15"); Integer elemento9 = new Integer("14"); Integer elemento10 = new Integer("13"); } }