Inserción,borrado y búsqueda en Arboles Binarios(Java)

Post on 13-Jun-2015

25.627 views 6 download

description

Borrado-Inserccion y Busqueda en arboles binarios de busqueda

Transcript of Inserción,borrado y búsqueda en Arboles Binarios(Java)

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