Diapositivas Apoyo

Download Report

Transcript Diapositivas Apoyo

Árboles Binarios de Búsqueda
(ABB)
• ABB = Árbol binario ordenado según uno o más criterios
• Cada nodo tiene dos hijos:
– el subárbol izquierdo es el árbol vacío o es un subárbol que contiene nodos
cuya clave es menor que la suya
– el subárbol izquierdo es el árbol vacío o es un subárbol que contiene nodos
cuya clave es mayor que la suya
• ¿Cuál de estos dos árboles binarios de enteros es un ABB?
7
4
7
9
8
4
9
8
Estructura de Datos II
TAD ABB: inserción
• Los nodos se insertan siempre como nodos hoja
• El algoritmo de inserción garantiza para cada nodo del árbol que:
- Su subárbol izquierdo contiene claves menores
- Su subárbol derecho contiene claves mayores
• Funcionamiento:
- Si el árbol estuviera vacío, se inserta el nodo en la raíz .
- Si no, se va recorriendo el árbol:
• En cada nodo se decide si hay que insertar a la derecha o la
izquierda.
• Si el subárbol en que hay que insertar es vacío, se inserta el nuevo
elemento.
• Si el subárbol en que hay que insertar no es vacío hay que
recorrerlo hasta encontrar el lugar que le corresponde al nodo en ese
subárbol.
- Es un algoritmo recursivo.
TAD ABB: Ejemplo de inserción
• Insertar 8, 5, 1, 20, 12, 6, 4

Insertar 8

Insertar 5
8
5

Insertar 1

Insertar 20

Insertar 12

Insertar 6

Insertar 4
1
6
4
Estructura de Datos II
20
12
TAD ABB: Ejemplo de borrado
• Borrar 8
Sustituir por 6
Sustituir por 12
Estructura de Datos II
TAD ABB: Ejemplo de borrado
• Borrar 1
• Borrar 20
• Borrar 5
Borrar 1
Borrar 20
Estructura de Datos II
Borrar 5
ÁRBOLES BINARIOS DE BUSQUEDA
El árbol binario de búsqueda es una
estructura sobre la cual se pueden realizar
eficientemente las operaciones de búsqueda,
inserción y eliminación.
En las listas, las operaciones de inserción y
eliminación se pueden llevar a cabo con facilidad,
sin embargo la búsqueda es una operación
bastante costosa que incluso nos puede llevar a
recorrer todos los elementos de ella para localizar
uno en particular.
Definición de Árbol binario de
Búsqueda

Para todo nodo T del árbol debe cumplirse que
todos los valores de los nodos del subárbol izquierdo de T
deben ser menores al valor del nodo T. De forma similar,
todos los valores de los nodos del subárbol derecho de T
deben ser mayores al valor del nodo T.

Es aquel en el que el hijo de la izquierda (si existe)
de cualquier nodo contiene un valor más pequeño que el
nodo padre, y el hijo de la derecha (si existe) contiene un
valor más grande que el nodo padre.
En la siguiente figura tenemos un ejemplo de árbol binario
de búsqueda.
Observe que si en dicho árbol se
sustituye el valor 140 del nodo por 160, 99
por 105 y 43 por 55; el árbol continúa siendo
un árbol binario de búsqueda. Ahora bien, si
en dicho árbol se remplaza el valor 87 del
nodo por 125, entonces el árbol deja de ser
un árbol binario de búsqueda puesto que
viola el principio que dice que: “Todos los
nodos del subárbol izquierdo del nodo T
deben ser menores o iguales al nodo T” (en
este caso 125 no es menor a 120).
También es posible observar que si se efectúa un
recorrido inorden sobre un árbol de búsqueda se obtendrá
una clasificación de los nodos en forma ascendente. El
recorrido inorden del árbol de la figura anterior produce el
siguiente resultado:
22-43-56-65-87-93-99-120-130-135-140
Algoritmo de Búsqueda en un ABB
BÚSQUEDA (NODO, INFOR )
1. Si INFOR < NODO^.INFO
entonces
1.1 Si NODO^.IZQ = NULL
entonces
Escribir “El ncdo no se encuentra en el árbol”
si no
Regresar a BÚSQUEDA con N0DO^.IZQ e INFOR {Llamada recursiva}
1.2 { Fin del condicional del paso 1.1}
si no
1.3 Si INFOR> NODO^.INFO
entonces
1.3.1 Si NODO^.DER = NULL
entonces
Escribir “El nodo no se encuentra en el árbol”
si no
Regresar a BUSQUEDA con NODO^.DER e INFOR
{ Llamada recursiva)
1.3.2 (Fin del condicional del paso 1.3.1
si no
Escribir “El nodo se encuentra en el árbol”
1.4 { Fin del condicional del paso 1.3}
2. { Fin del condicional del paso 1}
BUSQUEDA1 (NODO, INFOR)
1. Si NODO ≠ NULL
entonces
1.1 Si INFOR < NODO^.INFO
entonces
Regresa a BÚSQUEDA1 con NODO^.IZQ e INFOR {Llamada recursiva}
si no
1.1.1 Si INFOR > NODO^.INFO
entonces
Regresa a BÚSQUEDA1 con NODO^.DER e INFOR {Llamada recursiva}
si no
Escribir “El nodo se encuentra en el árbol”
1.1.2 {Fin del condicional del paso 1.1.1}
1.2 {Fin del condicional del paso 1.1}
si no
Escribir “El nodo no se encuentra en el árbol”
2. {Fin del condicional del paso 1}
INSERCIÓN EN UN ÁRBOL BINARIO DE BÚSQUEDA
La inserción es una operación que se puede realizar
eficientemente en un árbol binario de búsqueda. La estructura
crece conforme se inserten elementos al árbol. Los pasos que
deben realizarse para insertar un elemento a un árbol binario
de búsqueda son los siguientes:
1.
2.
Debe compararse la clave a insertar con la raíz del árbol. Si es
mayor, debe avanzarse hacia el subárbol derecho. Si es menor,
debe avanzarse hacia el subárbol izquierdo.
Repetir sucesivamente el paso 1 hasta que se cumpla alguna de
las siguientes condiciones:
2.1 EL subárbol derecho es igual a vacío, o el subárbol izquierdo
es igual a vació; en cuyo caso se procederá a insertar el
elemento en el lugar que le corresponde.
2.2 La clave que quiere insertarse es igual a la raíz del árbol; en
cuyo caso no se realiza la inserción.
Ejemplo
Supóngase que quieren insertarse las
siguientes claves en un árbol binario de búsqueda
que se encuentre vacío:
claves: 120-87 - 43-65-140-99- 130-22-56
Los resultados parciales que ilustran cómo
funciona el procedimiento se presentan en las
figuras que siguen:
Inserción : clave 120
Inserción: Clave 140
clave 87
clave 43
Clave 99
clave 65
Clave 130
Inserción: Clave 22
Clave 56
Nota: Las líneas gruesas indican el elemento que acaba de
insertarse.
Inserción en un Árbol Binario de Búsqueda
INSERCIÓN (NODO, INFOR)
1. Si INFOR < NODO^.INFO
entonces
1.1 Si NODO^.IZQ = NULL
entonces
CREA (OTRO) {Crear un nuevo nodo}
Hacer OTRO^.IZQNULL, OTRO^.DERNULL, OTRO^.INFOINFOR y
NODO^.IZQOTRO
si no
Regresar a INSERCIÓN con NODO^.IZQ e INFOR {Llamada recursiva}
1.2 {Fin del condicional del paso 1.1}
si no
1.3 Si INFOR > NODO^.INFO
entonces
1.3.1 Si NODO^.DER =NULL
entonces
CREA (OTRO) {Crear un nuevo nodo}
Hacer OTRO^.IZQNULL, OTRO^.DERNULL, OTRO^.INFOINFOR y
NODO^.DEROTRO
si no
Regresar a INSERCIÓN con NODO^.DER e INFOR {Llamada recursiva}
1.3.2 {Fin del condicional del paso 1.3.1}
si no
Escribir “El nodo ya se encuentran en el árbol”
1.4 {Fin del condicional del paso 1.3}
2. {Fin del condicional del paso 1}
INSERCIÓN1 (NODO INFOR)
1. Si NODO ≠ NULL
entonces
1.1 Si INFOR < NODO^.INFO
entonces
Regresar a INSERCIÓN1 con NODO^.IZQ e INFOR {Llamada recursiva}
si no
1.1.1 Si INFOR > NODO^.INFO
entonces
Regresar a INSERCIÓN1 con NODO^.DER e INFOR {Llamada
recursiva}
si no
Escribir “El nodo ya se encuentra en el árbol”
1.1.2 {Fin del condicional del paso 1,1.1 }
1.2 { Fin del condicional del paso 1.1}
si no
CREA (OTRO) {Crear un nuevo nodo}
Hacer OTRO^.IZQNULL, OTRO^.DERNULL, OTRO^.INFOINFOR y
NODOOTRO
2. { Fin del condicional del paso 1}
BORRADO EN UN ÁRBOL BINARIO DE BÚSQUEDA
1.
2.
3.
La operación de borrado es un poco más complicada que la
de inserción. Ésta consiste en eliminar un nodo del árbol sin
violar los principios que definen justamente un árbol binario de
búsqueda. Se debe distinguir los siguientes casos:
Si el elemento a borrar es terminal u hoja, simplemente se
suprime.
Si el elemento a borrar tiene un solo descendiente, entonces
tiene que sustituirse por ese descendiente.
Si el elemento a borrar tiene los dos descendientes, entonces se
tiene que sustituir por el nodo que se encuentra más a la
izquierda en el subárbol derecho o por el nodo que se
encuentra más a la derecha en el subárbol izquierdo.
Además, debemos recordar que antes de eliminar un nodo,
debe localizársele en el árbol. Para esto, se utilizará el algoritmo
de búsqueda.
Ejemplo:
Supóngase que se desea eliminar las siguientes
claves del árbol binario de búsqueda de la figura anterior:
claves: 22 - 99 - 87 - 120 - 140 - 135 – 56
Los resultados parciales que ilustran cómo funciona
el procedimiento se presentan en las figuras que siguen:
ELIMINACIÓN: CLAVE 22
ELIMINACIÓN: CLAVE 99
a)
Nota: Las flechas indican el elemento que quiere eliminarse.
a) y f) corresponden al primer caso
b)
ELIMINACIÓN: CLAVE 87
ELIMINACIÓN: CLAVE 87
c)
d)
Eliminación en un árbol binario de búsqueda.
b) y c) corresponden al segundo caso; c) y d) corresponden al tercer caso.
g) Estado final del árbol.
ELIMINACIÓN: CLAVE 140
e)
ELIMINACIÓN: CLAVE 135 - 56
f)
g)
Eliminación en un Árbol Binario de Búsqueda
ELIMINACIÓN (NODO, INFOR)
1. Si NODO ≠ NULL
entonces
1.1 Si INFOR < NODO^.INFO
entonces
Regresar a ELIMINACIÓN con NODO^.IZQ e INFOR {Llamada recursiva}
si no
1.1.1 Si INFOR > NODO^.INFO
entonces
Regresar a ELIMINACION con NODO^.DER e INFOR {Llamada recursiva }
si no
Hacer OTRONODO
1.1.1.A Si OTRO^.DER = NULL
entonces
Hacer NODOOTRO^.IZQ
si no
1.1.1.B SÍ OTRO^.IZQ = NULL
entonces
Hacer NODOOTRO^.DER
si no
Hacer AUXOTRO^.IZQ y AUX1AUX
1.1.1.C Repetir mientras AUX^.DER ≠ NULL
Hacer AUX1AUX y AUXAUX^.DER
1.1.2.C {Fin del ciclo del paso 1.1.1.C}
Hacer OTRO^.INFO AUX^.INFO, OTROAUX y AUX1^.DERAUX^.IZQ
1.1.2.B {Fin del condicional del paso 1.1.1.B}
1.1.2.A {Fin del condicional del paso 1.1.1.A}
1.1.2 {Fin del condicional del paso 1.1.1}
1.2 {Fin del condicional del paso 1.1}
QUITA (OTRO) {Libera la memoria del nodo)
si no
Escribir “El nodo no se encuentra en el árbol”
2. {Fin del condicional del paso 1}