Post on 13-Jun-2015
description
UNIVERSIDAD TECNICA DEL NORTE
ESTRUCTURA DE DATOS II
CARRERA DE INGENIERIA EN SISTEMAS COMPUACIONALES
UTN-FICA-CISIC 2012
ÁRBOL ABBUn á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
UTN-FICA-CISIC 2012
OPERACIONESTodas 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
BÚSQUEDALa 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
BÚSQUEDASi se alcanza un nodo hoja y el elemento no
ha sido encontrado se supone que no existe en el árbol.
ELIMINACIÓNLa 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
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; }
Borrar un nodo sin hijos ó nodo hoja: simplemente se borra y se establece a nulo el
apuntador de su padre.
UTN-FICA-CISIC 2012
13
21
10 18 25 40
33Nodo Padre localizado
13
21
10 18 25 40
33
Desconectarlo y liberar el nodo
Paso1
Paso2
Eliminar el valor 25
UTN-FICA-CISIC 2012
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
13
21
10 18 25 40
33Nodo Padre localizado
13
21
10 18
25
40
33
Conectar el Nodo Padre con el Nodo Hijo y liberar el nodo.
Paso1
Paso2
Eliminar el valor 25
29
27 30
29
27 30
UTN-FICA-CISIC 2012
Eliminar nodo con dos hijos1. 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
21
10 18 2540
33
Localizar el valor a borrar
Paso1
Eliminar el valor 21 utilizando el predecesor
13
21
10 18 2540
33
Localizar el Predecesor
Paso2
13
18
10 18 2540
33
Copiar el valor del Predecesor al nodo que contenía el valor a borrar
Paso3
13
18
10 18 25 40
33
Desconectar y liberar el nodo del Predecesor
Paso4
UTN-FICA-CISIC 2012
Eliminar el valor 21 utilizando el Sucesor
13
21
10 18 2540
33
Localizar el valor a borrar
Paso1
13
21
10 18 2540
33
Localizar el Sucesor
Paso2
13
25
10 18 2540
33
Copiar el valor del Sucesor al nodo que contenía el valor a borrar
Paso3
13
18
10 18 25 40
33
Desconectar y liberar el nodo del Sucesor
Paso4
UTN-FICA-CISIC 2012
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 {
//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
} } 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 }
GRACIAS
UTN-FICA-CISIC 2012