Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arboles Binarios Busqueda
Arboles Binarios Busqueda
diseño de algoritmos
Árboles de búsqueda binaria
Abril de 2018
Propiedad de un árbol de búsqueda binaria
Árboles y recorrido inorden
Operaciones mínimo, máximo, sucesor y predecesor
Inserción y eliminación
Árboles
Por qué son importantes los árboles
• Operaciones básicas como insertar, borrar y buscar,
toman un tiempo proporcional a la altura del árbol
• Para un árbol binario completo con n nodos, las
operaciones básicas toman Θ(lgn)
• Si el árbol se construye como una cadena lineal de n
nodos, tomarían Θ(n)
Árboles
Árbol de búsqueda binaria
Es un árbol binario en el cual se cumple que, para cada nodo
x, los nodos del subarbol izquierdo son menores o iguales a
x y que, los nodos del subarbol derecho son mayores o
iguales a x
2
0
3
1 0
2 3
4 4
2 2
1 6
Árboles
Propiedad del árbol de búsqueda binaria
Sea x un nodo del árbol. Si y es un nodo en el subarbol
izquierdo de x, entonces key[y]≤key[x]. Si y es un nodo en
el subarbol derecho de x, entonces key[y]≥key[x]
2
0
3
1 0
2 3
4 4
2 2
1 6
Árboles
Propiedad del árbol de búsqueda binaria
Sea x un nodo del árbol. Si y es un nodo en el subarbol
izquierdo de x, entonces key[y]≤key[x]. Si y es un nodo en
el subarbol derecho de x, entonces key[y]≥key[x]
2
5
3
3 7
7
2 5 8
5 8
5
Árboles
2
0
3
1 0
2 3
4 4
2 2
1 6
Árboles
1 3
2 5
2 4
Árboles
4 7
4 6 8
1 4 5 7
Árboles
INORDER-TREE-WALK(x)
if x ≠ nil
then INORDER-TREE-WALK(left[x])
print key[x]
INORDER-TREE-WALK(right[x])
Árboles
•Recorra los árboles de búsqueda binaria previos, en inorden
4 7
4 6 8
1 4 5 7
Árboles
En un árbol de búsqueda binaria dónde se ubica el elemento mínimo?
5
Idea: seguir los apuntadores al hijo
izquierdo desde la raiz hasta que 4 7
se encuentre nil
4 6 8
1 4 5 7
Árboles
En un árbol de búsqueda binaria dónde se ubica el elemento mínimo?
5
TREE-MINIMUN(x)
while left[x] ≠nil 4 7
do x←left[x]
return x 4 6 8
1 4 5 7
Árboles
En un árbol de búsqueda binaria dónde se ubica el elemento máximo?
5
Idea: seguir los apuntadores al hijo
derecho desde la raiz hasta que 4 7
se encuentre nil
4 6 8
1 4 5 7
Árboles
En un árbol de búsqueda binaria dónde se ubica el elemento máximo?
5
TREE-MAXIMUM(x)
while right[x] ≠nil 4 7
do x←right[x]
return x 4 6 8
1 4 5 7
Árboles
Sucesor
Dado un nodo x donde key[x]=k, el sucesor de x es el nodo y tal que
key[y] es la llave más pequeña, mayor que key[x]
8
Cuál es el sucesor de 7, 9, 10 y 12
1
7
0
4 9 1
2
1
1 6 8
0
Árboles
TREE-SUCCESSOR(x)
if right[x]≠nil
then return TREE-MINIMUM(right[x])
y←p[x]
8
while y≠nil and x=right[y]
1
do x←y 7
1
y←p[y]
4 9 1
return y 2
1
1 6 8
0
Explique el código anterior
para el caso de TREE-SUCCESSOR(4)
Árboles
TREE-SUCCESSOR(x)
if right[x]≠nil
then return TREE-MINIMUM(right[x])
y←p[x]
8
while y≠nil and x=right[y]
1
do x←y 7
1
y←p[y]
4 9 1
return y 2
1
1 6 8
0
Explique el código anterior
para el caso de TREE-SUCCESSOR(7)
Árboles
TREE-SUCCESSOR(x)
if right[x]≠nil
then return TREE-MINIMUM(right[x])
y←p[x] 2
while y≠nil and x=right[y]
3
do x←y
y←p[y]
7
return y
5 8
x←root[T] 1
4
0
while x≠nil
do y←x 3 1
7
2
if key[z]<key[x]
1
then x←left[x]
else x←right[x] Explique el código para el caso
de TREE-INSERT(z), donde
p[z]←y
key[z]=5
if y=nil
then root[T]←z
else if key[z]<key[y]
then left[y]←z
else right[y]←z
TREE-INSERT(x)
y←nil 8
x←root[T] 1
4
0
while x≠nil
do y←x 3 1
7
2
if key[z]<key[x]
1
then x←left[x]
else x←right[x] Explique el código para el caso
de TREE-INSERT(z), donde
p[z]←y
key[z]=9
if y=nil
then root[T]←z
else if key[z]<key[y]
then left[y]←z
else right[y]←z
TREE-INSERT(x)
y←nil 8
x←root[T] 1
4
0
while x≠nil
do y←x 3 1
7
2
if key[z]<key[x]
1
then x←left[x]
else x←right[x] Explique el código para el caso
de TREE-INSERT(z), donde
p[z]←y
key[z]=11
if y=nil
then root[T]←z
else if key[z]<key[y]
then left[y]←z
else right[y]←z
TREE-INSERT(x)
y←nil 8
x←root[T] 1
4
0
while x≠nil
do y←x 3 1
7
2
if key[z]<key[x]
1
then x←left[x]
else x←right[x] La complejidad es de O(h)
p[z]←y
if y=nil
then root[T]←z
else if key[z]<key[y]
then left[y]←z
else right[y]←z
TREE-DELETE(x)
if left[z]=nil or right[z]=nil
then y←z
else y←TREE-SUCCESSOR(z)
if left[y]≠nil
then x←left[y]
else x←right[y]
if x≠nil
then p[x]←p[y]
if p[y]=nil
then root[T]←x
else if y=left[p[y]]
then left[p[y]]←x
else right[p[y]]←x
if y≠z
then key[z]←key[y]
return y
Caso 1:
Borrar z y z no tiene hijos.
TREE-DELETE(T,z), donde key[z]=5
1
2
1 1
0 6
3 1 1 2
1 3 0
1 5
Caso 1:
Borrar z y z no tiene hijos.
TREE-DELETE(T,z), donde key[z]=5
3 1 1 2
1 3 0
1 5
Caso 2:
Borrar z y z tiene un solo hijo
TREE-DELETE(T,z), donde key[z]=10
1
2
1 1
0 6
1 1
3
3 8
1 5
Caso 2:
Borrar z y z tiene un solo hijo
TREE-DELETE(T,z), donde key[z]=10
1 1
2 2
1 1 1
0 6 3 6
1 1 1 1
3 1 5
3 8 3 8
1 5
Caso 3:
Borrar z y z tiene dos hijos
TREE-DELETE(T,z), donde key[z]=12
1
2
1 1
0 6
1 1
3
3 8
1 5
Caso 3:
Borrar z y z tiene dos hijos
TREE-DELETE(T,z), donde key[z]=12
1
2
1 1
0 6
1 1
3
3 8
1 5
Caso 3:
Borrar z y z tiene dos hijos
TREE-DELETE(T,z), donde key[z]=12
1 1
3
3 8
1 5
Caso 3:
Borrar z y z tiene dos hijos
TREE-DELETE(T,z), donde key[z]=12
1 1
3
3 8
1 5
Caso 3:
Borrar z y z tiene dos hijos
TREE-DELETE(T,z), donde key[z]=12
1 1
2 3
1 1 1 1
0 6 0 6
1 1 1
3 3
3 8 8
1 5 1 5
TREE-DELETE(x) 1
if left[z]=nil or right[z]=nil 2
then y←z 1 1
0 6
else y←TREE-SUCCESSOR(z)
if left[y]≠nil
3 1 1 2
then x←left[y] 1 3 0
else x←right[y]
1 5
if x≠nil
then p[x]←p[y]
6
if p[y]=nil
then root[T]←x
8
else if y=left[p[y]]
then left[p[y]]←x
Siga el algoritmo TREE-DELETE(T,z)
else right[p[y]]←x
donde z es el nodo tal que key[z]=11
if y≠z
then key[z]←key[y]
return y
TREE-DELETE(x) 1
if left[z]=nil or right[z]=nil 2
then y←z 1 1
0 6
else y←TREE-SUCCESSOR(z)
if left[y]≠nil
3 1 1 2
then x←left[y] 1 3 0
else x←right[y]
1 5
if x≠nil
then p[x]←p[y]
6
if p[y]=nil
then root[T]←x
8
else if y=left[p[y]]
then left[p[y]]←x
Siga el algoritmo TREE-DELETE(T,z)
else right[p[y]]←x
donde z es el nodo tal que key[z]=6
if y≠z
then key[z]←key[y]
return y
TREE-DELETE(x) 1
if left[z]=nil or right[z]=nil 2
then y←z 1 1
0 6
else y←TREE-SUCCESSOR(z)
if left[y]≠nil
3 1 1 2
then x←left[y] 1 3 0
else x←right[y]
1 5
if x≠nil
then p[x]←p[y]
6
if p[y]=nil
then root[T]←x
8
else if y=left[p[y]]
then left[p[y]]←x
Siga el algoritmo TREE-DELETE(T,z)
else right[p[y]]←x
donde z es el nodo tal que key[z]=10
if y≠z
then key[z]←key[y]
return y
Referencias
Próximo tema:
Estructuras de datos: Arboles rojinegros