Vous êtes sur la page 1sur 18

UNIVERSIDAD TECNICA DEL NORTE

CARRERA DE INGENIERIA EN SISTEMAS COMPUACIONALES ESTRUCTURA DE DATOS II

UTN-FICA-CISIC 2012

RBOL ABB
Un rbol binario de bsqueda es un tipo particular

de rbol binario que presenta una estructura de datos en forma de rbol usada en informtica.

UTN-FICA-CISIC 2012

UTN-FICA-CISIC 2012

OPERACIONES
Todas las operaciones realizadas sobre rboles binarios de bsqueda

estn basadas en la comparacin de los elementos o clave de los mismos.

UTN-FICA-CISIC 2012

BSQUEDA
La bsqueda consiste acceder a la raz del rbol, si el

elemento a localizar coincide con ste la bsqueda ha concluido con xito. Si el elemento es menor se busca en el subrbol izquierdo y si es mayor en el derecho. La bsqueda de un elemento en un ABB (rbol Binario de Bsqueda) se puede realizar de dos formas, iterativa o recursiva.

UTN-FICA-CISIC 2012

BSQUEDA
Si se alcanza un nodo hoja y el elemento no ha sido

encontrado se supone que no existe en el rbol.

ELIMINACIN
La operacin de borrado no es tan sencilla como las de

bsqueda e insercin. Existen varios casos a tener en consideracin.

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

Caso: Eliminar Nodo hoja


Paso 1
13

Eliminar el valor 25
21

33

Nodo Padre localizado

10

18

25

40

Paso 2
13

21
33

10

18

25

40
Desconectarlo y liberar el nodo

UTN-FICA-CISIC 2012

Borrar un nodo con un subrbol hijo: se borra el

nodo y se asigna su subrbol hijo como subrbol de su padre. Eliminar Nodo 70.

UTN-FICA-CISIC 2012

Caso: Eliminar Nodo con un hijo


Paso 1
13 21

Eliminar el valor 25
33
Nodo Padre localizado

10

18

25 29 27

40

Paso 2
13

21
33 25

30

10

18 29 27 30

40

Conectar el Nodo Padre con el Nodo Hijo y liberar el nodo.

UTN-FICA-CISIC 2012

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 implementacin es igual de eficiente programar la bsqueda del predecesor que del sucesor.

2. 3.

El valor del Predecedor (o sucesor) se copia al nodo a borrar. Eliminar el nodo del predecesor (o sucesor segn sea el caso).

UTN-FICA-CISIC 2012

Caso: Eliminar Nodo con dos hijos


Eliminar el valor 21 utilizando el predecesor

Paso 1
13

21

Localizar el valor a borrar

Paso 2
13

21 33

33 10

10

18

25

40

18

25

40

Localizar el Predecesor

Paso 3
13
10

18

Copiar el valor del Predecesor al nodo que contena el valor a borrar

Paso 4
13

18 33

33 10 18 25 40

18

25

40
Desconectar y liberar el nodo del Predecesor

UTN-FICA-CISIC 2012

Caso: Eliminar Nodo con dos hijos


Eliminar el valor 21 utilizando el Sucesor

Paso 1
13

21

Localizar el valor a borrar

Paso 2
13

21 33

33 10

10

18

25

40

18

25

40
Localizar el Sucesor

Paso 3
13
10

25

Copiar el valor del Sucesor al nodo que contena el valor a borrar

Paso 4
13

18 33

33 10 18 25 40
Desconectar y liberar el nodo del Sucesor

18

25

40

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

Vous aimerez peut-être aussi