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

5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarioselcapo2008
 
Estructuras lineales unidad 3
Estructuras lineales unidad 3Estructuras lineales unidad 3
Estructuras lineales unidad 3eliezerbs
 
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
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..NANO-06
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos Kaneki04
 
Ordenamiento en C++
Ordenamiento en C++Ordenamiento en C++
Ordenamiento en C++compumet sac
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacionLuis Igoodbad
 
Estructura de datos lineales y no lineales
Estructura de datos lineales y no linealesEstructura de datos lineales y no lineales
Estructura de datos lineales y no linealeslos4estatidinamicos
 
Transformar modelo entidad relacion a modelo logico
Transformar modelo entidad relacion a modelo logicoTransformar modelo entidad relacion a modelo logico
Transformar modelo entidad relacion a modelo logicojosecuartas
 
Programación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaProgramación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaAngel Vázquez Patiño
 
Método de ordenamiento por selección (selection sort
Método de ordenamiento por selección (selection sortMétodo de ordenamiento por selección (selection sort
Método de ordenamiento por selección (selection sortlinkinpark03
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y NodosBoris Salleg
 
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
 

Tendances (20)

5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarios
 
Estructuras lineales unidad 3
Estructuras lineales unidad 3Estructuras lineales unidad 3
Estructuras lineales unidad 3
 
Arboles AVL
Arboles AVLArboles AVL
Arboles AVL
 
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
 
Arboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de BusquedaArboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de Busqueda
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Ordenamiento en C++
Ordenamiento en C++Ordenamiento en C++
Ordenamiento en C++
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacion
 
Estructura de datos lineales y no lineales
Estructura de datos lineales y no linealesEstructura de datos lineales y no lineales
Estructura de datos lineales y no lineales
 
Ordenamiento parte 2
Ordenamiento parte 2Ordenamiento parte 2
Ordenamiento parte 2
 
Árboles Multicamino, B y B+
Árboles Multicamino, B y B+Árboles Multicamino, B y B+
Árboles Multicamino, B y B+
 
Transformar modelo entidad relacion a modelo logico
Transformar modelo entidad relacion a modelo logicoTransformar modelo entidad relacion a modelo logico
Transformar modelo entidad relacion a modelo logico
 
Programación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en javaProgramación 3: listas y conjuntos en java
Programación 3: listas y conjuntos en java
 
Método de ordenamiento por selección (selection sort
Método de ordenamiento por selección (selection sortMétodo de ordenamiento por selección (selection sort
Método de ordenamiento por selección (selection sort
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
Algoritmos de Ordenamiento externo
Algoritmos de Ordenamiento externoAlgoritmos de Ordenamiento externo
Algoritmos de Ordenamiento externo
 
conceptos de Punteros y Nodos
conceptos de Punteros y Nodosconceptos de Punteros y Nodos
conceptos de Punteros y Nodos
 
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
 
Arboles multicamino
Arboles  multicaminoArboles  multicamino
Arboles multicamino
 

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

La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdfDemetrio Ccesa Rayme
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOluismii249
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfcarolinamartinezsev
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Katherine Concepcion Gonzalez
 
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...JoseMartinMalpartida1
 
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxCONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxroberthirigoinvasque
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docxEliaHernndez7
 
prostitución en España: una mirada integral!
prostitución en España: una mirada integral!prostitución en España: una mirada integral!
prostitución en España: una mirada integral!CatalinaAlfaroChryso
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Juan Martín Martín
 
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...Ars Erótica
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfapunteshistoriamarmo
 
Actividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxActividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxpaogar2178
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxBeatrizQuijano2
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxFernando Solis
 
activ4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfactiv4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfRosabel UA
 

Dernier (20)

La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdf
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...
1ro Programación Anual D.P.C.C planificación anual del área para el desarroll...
 
Tema 11. Dinámica de la hidrosfera 2024
Tema 11.  Dinámica de la hidrosfera 2024Tema 11.  Dinámica de la hidrosfera 2024
Tema 11. Dinámica de la hidrosfera 2024
 
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxCONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
prostitución en España: una mirada integral!
prostitución en España: una mirada integral!prostitución en España: una mirada integral!
prostitución en España: una mirada integral!
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024
 
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdf
 
Actividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxActividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docx
 
PP_Comunicacion en Salud: Objetivación de signos y síntomas
PP_Comunicacion en Salud: Objetivación de signos y síntomasPP_Comunicacion en Salud: Objetivación de signos y síntomas
PP_Comunicacion en Salud: Objetivación de signos y síntomas
 
Usos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicasUsos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicas
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptx
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
activ4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfactiv4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdf
 

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"); } }