Inserción,borrado y búsqueda en Arboles Binarios(Java)
1. UNIVERSIDAD TECNICA
DEL NORTE
CARRERA DE INGENIERIA EN
SISTEMAS COMPUACIONALES
ESTRUCTURA DE DATOS II
UTN-FICA-CISIC 2012
2. ÁRBOL ABB
Un árbol binario de búsqueda es un tipo particular
de árbol binario que presenta una estructura de datos
en forma de árbol usada en informática.
UTN-FICA-CISIC 2012
4. OPERACIONES
Todas las operaciones realizadas
sobre árboles binarios de búsqueda
están basadas en la comparación
de los elementos o clave de los
mismos.
UTN-FICA-CISIC 2012
5. BÚSQUEDA
La búsqueda consiste acceder a la raíz del árbol, si el
elemento a localizar coincide con éste la búsqueda ha
concluido con éxito.
Si el elemento es menor se busca en el subárbol
izquierdo y si es mayor en el derecho.
La búsqueda de un elemento en un ABB (Árbol
Binario de Búsqueda) se puede realizar de dos formas,
iterativa o recursiva.
UTN-FICA-CISIC 2012
6. BÚSQUEDA
Si se alcanza un nodo hoja y el elemento no ha sido
encontrado se supone que no existe en el árbol.
ELIMINACIÓN
La operación de borrado no es tan sencilla como las
de búsqueda e inserción. Existen varios casos a tener
en consideración.
UTN-FICA-CISIC 2012
7. CODIGO EN JAVA METODO
BUSCAR
public NodoABB buscar(String r){
NodoABB a=(NodoABB) raiz.getInfo();
while(a!=null){
Persona per=(Persona)a.getInfo();
if(per.getCedula().equals(r))
return a;
else if (per.getCedula().compareTo(r)>0)
a=a.getIzq();
else if(per.getCedula().compareTo(r)<0)
a=a.getDer();
}
return null;
}
8. Borrar un nodo sin hijos ó nodo hoja:
simplemente se borra y se establece a nulo el
apuntador de su padre.
UTN-FICA-CISIC 2012
9. Paso Eliminar el valor 25
21
1
Nodo Padre
33 localizado
13
Paso
10 18 25 40 21
2
13 33
10 18 40
25
Desconectarlo y
liberar el nodo
UTN-FICA-CISIC 2012
10. Borrar un nodo con un subárbol hijo: se borra el
nodo y se asigna su subárbol hijo como subárbol de su
padre.
Eliminar Nodo 70.
UTN-FICA-CISIC 2012
11. Paso 21 Eliminar el valor 25
1
Nodo Padre
33 localizado
13
Paso
10 18 25 40 21
2
29 13 33
25
27 30 40
10 18
29
Conectar el Nodo
Padre con el Nodo
27 30 Hijo y liberar el
nodo.
UTN-FICA-CISIC 2012
12. Eliminar nodo con dos hijos
1. Localizar el nodo predecesor o sucesor del
nodo a borrar.
El PREDECESOR es “el Mayor de los Menores”.
El SUCESOR es “el Menor de los Mayores”.
Para la implementación es igual de eficiente
programar la búsqueda del predecesor que del
sucesor.
2. El valor del Predecedor (o sucesor) se copia
al nodo a borrar.
3. Eliminar el nodo del predecesor (o sucesor
según sea el caso).
UTN-FICA-CISIC 2012
13. Eliminar el valor 21
utilizando el predecesor
Paso Localizar el valor a Paso 21
1 21 borrar 2
13 33
13 33
10 40
40 18 25
10 18 25
Localizar el Predecesor
Copiar el valor del Paso
Paso Predecesor al nodo que 4 18
3 18 contenía el valor a borrar
13 33
13 33
10 25 40
18
10 18 40
25 Desconectar y liberar el
UTN-FICA-CISIC 2012 nodo del Predecesor
14. Eliminar el valor 21
utilizando el Sucesor
Paso Localizar el valor a Paso 21
1 21 borrar 2
13 33
13 33
10 40
40 18 25
10 18 25
Localizar el Sucesor
Copiar el valor del Paso
Paso Sucesor al nodo que 4 18
3 25 contenía el valor a borrar
13 33
13 33
10 18 25 40
10 18 40
25 Desconectar y liberar el
nodo del Sucesor
UTN-FICA-CISIC 2012
15. public boolean Borrar(String dato)
{
NodoABB aux2 = null;
NodoABB aux = (buscar(dato));
if (buscar(dato) != null)// SI ES NODO HOJA
{
if ((aux.getIzq() == null) && (aux.getDer() == null))
{
aux = null;
}
else
{
if (aux.getIzq() != null && aux.getDer() != null)//SI TIENE 2 HIJOS
{
if (aux == raiz)//Si es el nodo raiz con 2 hijos
{
aux2 = aux.getIzq();
aux = aux.getDer();
while (aux.getIzq() != null)
{
aux = aux.getIzq();//Recorre por la izquierda
}
aux.setIzq(aux2);
}
else
{
16. //Si es otro nodo con 2 hijos
aux2 = aux.getIzq();
aux = aux.getDer();
while (aux.getIzq() != null)
{
aux = aux.getIzq();// recorre por la Izquierda
}
aux.setIzq(aux2);
}
}
else
{
if (aux == raiz) //SI EL NODO A BORRAR ES RAIZ Y TIENE UN SOLO HIJO
{
if (aux.getIzq() != null)//Si el nodo es raiz y tiene 1 solo hijo por la Izquierda
{
aux = aux.getIzq();
}
else
{
aux = aux.getDer(); //Si el nodo es raiz y tiene 1 solo hijo por la Derecha
17. }
}
else
{
if (aux.getIzq() != null) //Si es otro nodo y tiene 1 solo hijo por la Izquierda
{
aux = aux.getIzq();
}
else
{
aux = aux.getDer();//Si es otro nodo y tiene 1 solo hijo por la Izquierda
}
}
}
}
return true;//Cuando pudo ser encontrado el nodo a eliminar
}
return false; //Cuando no pudo ser encontrado el nodo a eliminar
}