SlideShare ist ein Scribd-Unternehmen logo
1 von 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");


                                                          }
                                                      }

Weitere ähnliche Inhalte

Was ist angesagt?

Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2angela montilla
 
Arbol rojo y negro
Arbol rojo y negroArbol rojo y negro
Arbol rojo y negroJuan Bass
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y NodosBoris Salleg
 
Programación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosProgramación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosAngel Vázquez Patiño
 
Algoritmos de busqueda - hash truncamiento
Algoritmos de busqueda - hash truncamientoAlgoritmos de busqueda - hash truncamiento
Algoritmos de busqueda - hash truncamientoLutzo Guzmán
 
Exposicion Busqueda
Exposicion BusquedaExposicion Busqueda
Exposicion BusquedaAngie Suarez
 
3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento internoFernando Solis
 
Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.Nabor Chirinos
 
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
 
Archivos secuenciales-indexados C++
Archivos secuenciales-indexados C++Archivos secuenciales-indexados C++
Archivos secuenciales-indexados C++EdsonRc
 
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
 
Reporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoReporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoTAtiizz Villalobos
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamientoLalo Chooper
 

Was ist angesagt? (20)

Algoritmo de ordenamiento: Heap Sort
Algoritmo de ordenamiento: Heap SortAlgoritmo de ordenamiento: Heap Sort
Algoritmo de ordenamiento: Heap Sort
 
Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2
 
Listas
ListasListas
Listas
 
Arbol rojo y negro
Arbol rojo y negroArbol rojo y negro
Arbol rojo y negro
 
Mergesort
MergesortMergesort
Mergesort
 
Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4
 
Data Structure (Tree)
Data Structure (Tree)Data Structure (Tree)
Data Structure (Tree)
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y Nodos
 
Indices tipo arbol b+
Indices tipo arbol b+Indices tipo arbol b+
Indices tipo arbol b+
 
Quicksort
QuicksortQuicksort
Quicksort
 
Programación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibradosProgramación 3: árboles de búsqueda equilibrados
Programación 3: árboles de búsqueda equilibrados
 
Algoritmos de busqueda - hash truncamiento
Algoritmos de busqueda - hash truncamientoAlgoritmos de busqueda - hash truncamiento
Algoritmos de busqueda - hash truncamiento
 
Exposicion Busqueda
Exposicion BusquedaExposicion Busqueda
Exposicion Busqueda
 
3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno3. algoritmos de ordenamiento interno
3. algoritmos de ordenamiento interno
 
Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.
 
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
 
Archivos secuenciales-indexados C++
Archivos secuenciales-indexados C++Archivos secuenciales-indexados C++
Archivos secuenciales-indexados C++
 
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
 
Reporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoReporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamiento
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdf
ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdfÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdf
ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdfluisantoniocruzcorte1
 
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdf
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdfTarea 5-Selección de herramientas digitales-Carol Eraso.pdf
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdfCarol Andrea Eraso Guerrero
 
Unidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteUnidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteJuan Hernandez
 
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfvictorbeltuce
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxdanalikcruz2000
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxJUANSIMONPACHIN
 
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
 
TEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfTEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfDannyTola1
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdfOswaldoGonzalezCruz
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADOJosé Luis Palma
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxMartín Ramírez
 
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
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
La evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariaLa evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariamarco carlos cuyo
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfManuel Molina
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOweislaco
 
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
 
Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024IES Vicent Andres Estelles
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 

Kürzlich hochgeladen (20)

ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdf
ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdfÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdf
ÉTICA, NATURALEZA Y SOCIEDADES_3RO_3ER TRIMESTRE.pdf
 
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdf
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdfTarea 5-Selección de herramientas digitales-Carol Eraso.pdf
Tarea 5-Selección de herramientas digitales-Carol Eraso.pdf
 
Unidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteUnidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parte
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdfMapa Mental de estrategias de articulación de las areas curriculares.pdf
Mapa Mental de estrategias de articulación de las areas curriculares.pdf
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
 
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docxPLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
PLANIFICACION ANUAL 2024 - INICIAL UNIDOCENTE.docx
 
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
 
TEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdfTEST DE RAVEN es un test conocido para la personalidad.pdf
TEST DE RAVEN es un test conocido para la personalidad.pdf
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
 
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
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
La evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundariaLa evolucion de la especie humana-primero de secundaria
La evolucion de la especie humana-primero de secundaria
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
 
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJOTUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
TUTORIA II - CIRCULO DORADO UNIVERSIDAD CESAR VALLEJO
 
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
 
Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024Metabolismo 3: Anabolismo y Fotosíntesis 2024
Metabolismo 3: Anabolismo y Fotosíntesis 2024
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.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"); } }