SlideShare una empresa de Scribd logo
1 de 4
Análisis de Algoritmos
Eliminar un elemento de un árbol binario de búsqueda
Eliminación de un elemento
La eliminación de un nodo de un árbol binario de búsqueda es más complicada que la
inserción, puesto que puede suponer la recolocación de varios de sus nodos. En líneas
generales un posible esquema para abordar esta operación es el siguiente:

1. Buscar el nodo que se desea borrar manteniendo un enlace a su padre (p)
2. Si se encuentra el nodo hay que contemplar tres casos posibles:
a. Si el nodo a borrar no tiene hijos, simplemente se libera el espacio que ocupa
b. Si el nodo a borrar tiene un solo hijo, se añade como hijo de su padre (p), sustituyendo la
posición ocupada por el nodo borrado.
c. Si el nodo a borrar tiene los dos hijos se siguen los siguientes pasos:
         i. Se busca el máximo de la rama izquierda o el mínimo de la rama derecha.
         ii. Se sustituye el nodo a borrar por el nodo encontrado.

Veamos gráficamente varios ejemplos de eliminación de un nodo:




                                                        L.I. María Luis Velasco Ramírez 1
Análisis de Algoritmos
Eliminar un elemento de un árbol binario de búsqueda
public boolean delete (int llave)
{
  Nodo actual = raíz;
  Nodo p = raíz;
  Bolean hijoizq= trae;

while (actual.iDato != llave)
 {
   p= actual;
   if (llave < actual.iDato)
   {
      hijoizq= trae;
      actual.actual.izq // va a la izquierda
   }
   else
   {
      hijoezq= false;
      actual= actual.der // va a la derecha
    }
   if (actual == null) // no lo encontro
       return false;
} // fin while

 // encontro el nodo a borrar

// si no tiene hijo, simplemente lo borra

if (actual.izq == null && actual.der == null)
 {
   (if actual == raiz)    // si es la raíz
     root = null;       // el árbol esta vacío
   else if(hijoizq)
          p.izq = null //lo desconecta de p
        else
          p.der = null;
 }

// si no tiene hijo derecho, lo reemplaza con el subárbol izquierdo
else if( actual.der == null)
          if (actual == raiz)
             raiz = actual.izq;
          else if (hijoizq)
                  p.izq =actual.izq;
               else
                  p.der= actual.izq;
        // si no tiene hijo izquierdo, lo reemplaza con el subarbol derecho
       else if (actual.izq == null)


                                                          L.I. María Luis Velasco Ramírez 2
Análisis de Algoritmos
Eliminar un elemento de un árbol binario de búsqueda
               if (actual == raiz)
                  raiz = actual.der;
               else if (hijoizq)
                        p.izq =actual.der;
                     else
                        p.der= actual.der;

             else // tiene dos hijos, es reemplazado por el sucesor
                {
                   // llama al metodo obtener sucesor del nodo a borrar (actual)
                  Nodo sucesor = getSucesor (actual);

                 // conecta p de actual con el sucesor

                 if (actual ==raiz)
                    raiz = sucesor;
                  else if (hijoizq)
                           p.izq= sucesor;
                        else
                            p.der=successor;
                  successor.izq = actual.izq //conecta sucesor con la rama izq de actual
                } //fin tiene dos hijos
             return trae;
     } fin borrar

private Nodo getSucesor(Nodo delNodo)
  {
    Nodo sucerorp= delNodo;
    Nodo sucesor = delNodo;
    Nodo actual= delNodo.der; / va al hijo derecho
    while (actual != null)

     {
         sucesorp = sucesor;
         sucesor = actual;
         actual = actual.izq;
     }
    //

    if (sucesor != delNodo.der)
        {
           sucesorp.izq= sucesor.der;
            sucesor.der = delNodo.der;
          }
    return sucesor;

  } // fin getSucesor


                                                         L.I. María Luis Velasco Ramírez 3
Análisis de Algoritmos
Eliminar un elemento de un árbol binario de búsqueda
Nota: getSucesor encuentra el mínimo de la rama derecha

TAREA para la siguiente clase.
Implementa el método getSucesor para encontrar el máximo de la rama izquierda.




                                                       L.I. María Luis Velasco Ramírez 4

Más contenido relacionado

Similar a Eliminarnodoarbolbinariobusqueda (7)

Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Caso b eliminar el nodo 7[1]
Caso b eliminar el nodo 7[1]Caso b eliminar el nodo 7[1]
Caso b eliminar el nodo 7[1]
 
Arboles
ArbolesArboles
Arboles
 
1 árbol
1 árbol1 árbol
1 árbol
 
Tema6-Arboles.pdf
Tema6-Arboles.pdfTema6-Arboles.pdf
Tema6-Arboles.pdf
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 

Más de María Luisa Velasco (20)

Respaldando bd
Respaldando bdRespaldando bd
Respaldando bd
 
Sql
SqlSql
Sql
 
Sql
SqlSql
Sql
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Ejercicios normalización
Ejercicios normalizaciónEjercicios normalización
Ejercicios normalización
 
Normalizacion
NormalizacionNormalizacion
Normalizacion
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Modulos sgbd
Modulos sgbdModulos sgbd
Modulos sgbd
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Induccion fundbd2012
Induccion fundbd2012Induccion fundbd2012
Induccion fundbd2012
 
Induccion fundbd2012
Induccion fundbd2012Induccion fundbd2012
Induccion fundbd2012
 
Guia eejerciciospracticos
Guia eejerciciospracticosGuia eejerciciospracticos
Guia eejerciciospracticos
 
Paradigmas de programación
Paradigmas de programaciónParadigmas de programación
Paradigmas de programación
 
Proyecto final de algoritmica
Proyecto final de algoritmicaProyecto final de algoritmica
Proyecto final de algoritmica
 
Ejercicios arreglos4
Ejercicios arreglos4Ejercicios arreglos4
Ejercicios arreglos4
 
Ejercicios arreglos2
Ejercicios arreglos2Ejercicios arreglos2
Ejercicios arreglos2
 
Seguridad bd
Seguridad bdSeguridad bd
Seguridad bd
 
Ejercicios3parte
Ejercicios3parteEjercicios3parte
Ejercicios3parte
 

Eliminarnodoarbolbinariobusqueda

  • 1. Análisis de Algoritmos Eliminar un elemento de un árbol binario de búsqueda Eliminación de un elemento La eliminación de un nodo de un árbol binario de búsqueda es más complicada que la inserción, puesto que puede suponer la recolocación de varios de sus nodos. En líneas generales un posible esquema para abordar esta operación es el siguiente: 1. Buscar el nodo que se desea borrar manteniendo un enlace a su padre (p) 2. Si se encuentra el nodo hay que contemplar tres casos posibles: a. Si el nodo a borrar no tiene hijos, simplemente se libera el espacio que ocupa b. Si el nodo a borrar tiene un solo hijo, se añade como hijo de su padre (p), sustituyendo la posición ocupada por el nodo borrado. c. Si el nodo a borrar tiene los dos hijos se siguen los siguientes pasos: i. Se busca el máximo de la rama izquierda o el mínimo de la rama derecha. ii. Se sustituye el nodo a borrar por el nodo encontrado. Veamos gráficamente varios ejemplos de eliminación de un nodo: L.I. María Luis Velasco Ramírez 1
  • 2. Análisis de Algoritmos Eliminar un elemento de un árbol binario de búsqueda public boolean delete (int llave) { Nodo actual = raíz; Nodo p = raíz; Bolean hijoizq= trae; while (actual.iDato != llave) { p= actual; if (llave < actual.iDato) { hijoizq= trae; actual.actual.izq // va a la izquierda } else { hijoezq= false; actual= actual.der // va a la derecha } if (actual == null) // no lo encontro return false; } // fin while // encontro el nodo a borrar // si no tiene hijo, simplemente lo borra if (actual.izq == null && actual.der == null) { (if actual == raiz) // si es la raíz root = null; // el árbol esta vacío else if(hijoizq) p.izq = null //lo desconecta de p else p.der = null; } // si no tiene hijo derecho, lo reemplaza con el subárbol izquierdo else if( actual.der == null) if (actual == raiz) raiz = actual.izq; else if (hijoizq) p.izq =actual.izq; else p.der= actual.izq; // si no tiene hijo izquierdo, lo reemplaza con el subarbol derecho else if (actual.izq == null) L.I. María Luis Velasco Ramírez 2
  • 3. Análisis de Algoritmos Eliminar un elemento de un árbol binario de búsqueda if (actual == raiz) raiz = actual.der; else if (hijoizq) p.izq =actual.der; else p.der= actual.der; else // tiene dos hijos, es reemplazado por el sucesor { // llama al metodo obtener sucesor del nodo a borrar (actual) Nodo sucesor = getSucesor (actual); // conecta p de actual con el sucesor if (actual ==raiz) raiz = sucesor; else if (hijoizq) p.izq= sucesor; else p.der=successor; successor.izq = actual.izq //conecta sucesor con la rama izq de actual } //fin tiene dos hijos return trae; } fin borrar private Nodo getSucesor(Nodo delNodo) { Nodo sucerorp= delNodo; Nodo sucesor = delNodo; Nodo actual= delNodo.der; / va al hijo derecho while (actual != null) { sucesorp = sucesor; sucesor = actual; actual = actual.izq; } // if (sucesor != delNodo.der) { sucesorp.izq= sucesor.der; sucesor.der = delNodo.der; } return sucesor; } // fin getSucesor L.I. María Luis Velasco Ramírez 3
  • 4. Análisis de Algoritmos Eliminar un elemento de un árbol binario de búsqueda Nota: getSucesor encuentra el mínimo de la rama derecha TAREA para la siguiente clase. Implementa el método getSucesor para encontrar el máximo de la rama izquierda. L.I. María Luis Velasco Ramírez 4