0% encontró este documento útil (0 votos)
202 vistas

Binary Search Tree

Este documento describe los árboles binarios de búsqueda (BST), incluidas sus propiedades, operaciones básicas como búsqueda, máximo, mínimo y sucesor, e inserción y eliminación de nodos. Explica que un BST almacena nodos con claves que cumplen la propiedad de que todas las claves en el subárbol izquierdo son menores que la clave del nodo raíz y todas las claves en el subárbol derecho son mayores. Luego detalla algoritmos recursivos y iterativos para buscar un

Cargado por

aj
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
202 vistas

Binary Search Tree

Este documento describe los árboles binarios de búsqueda (BST), incluidas sus propiedades, operaciones básicas como búsqueda, máximo, mínimo y sucesor, e inserción y eliminación de nodos. Explica que un BST almacena nodos con claves que cumplen la propiedad de que todas las claves en el subárbol izquierdo son menores que la clave del nodo raíz y todas las claves en el subárbol derecho son mayores. Luego detalla algoritmos recursivos y iterativos para buscar un

Cargado por

aj
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 4

Universidad Nacional de Ingeniera

Ciencias de la Computacin
Binary Search Trees (BST)
Yuri Nuez Medrano *
[email protected]

un BST en orden creciente usando simplemente un algorit-


mo recursivo llamado Inorder_Tree_Walk.

1.2. Inorder_Tree_Walk

Algorithm 1: INORDER_TREE_WALK(x)
Input: Un nodo x
Output: Las keys del subrbol que tiene a x com raz
en orden ascendente
1 if x 6= T.nil then
2 INORDER_TREE_WALK(x.lef t)
Figura 1: Ejemplo de un BST
3 print x.key
4 INORDER_TREE_WALK(x.right)
1. Binary Search Tree
Un BST es una estructura de datos ligada cuyos nodos En resumen, este algoritmo imprime la key de la raz luego
poseen bsicamente cuatro variables: una key y tres apun- de imprimir los valores en su subrbol izquierdo y antes de
tadores lef t, right y p que apuntan a un nodo hijo izquierdo, imprimir los valores del subrbol derecho. Similarmente, un
un nodo hijo derecho y un nodo padre respectivamente. Las preorder tree walk imprime el key de la raz antes de
keys en un BST deben estar almacenadas de tal manera que las keys de los subrboles y un postorder tree walk la
siempre cumplan la propiedad BST. imprime despus.

1.1. Propiedad BST


1.2.1. Anlisis del Tiempo de Ejecucin
Sea un nodo x en un BST, si y es un nodo en el subrbol
izquierdo de x (es decir, un subrbol que tiene como raz a Intuitivamente podemos decir que el tiempo de ejeucin
x.lef t) y z un nodo en el subrbol derecho de x, tenemos la de este algoritmo es O(n), pues imprime las keys de cada
siguiente relacin nodo en el subrbol que tiene a x como raz. Probemos
esto usando el mtodo de sustitucin. Tomando k como la
y.key < x.key z.key cantidad de nodos en el subrbol tenemos

En la figura 1 tenemos un ejemplo de un BST en el que T (n) = T (k) + T (n k 1) + d


podemos apreciar la disposicin de la keys de tal manera ((c + d)k + c) + ((c + d)(n k 1) + c) + d
que cumplan la propiedad BST.
= (c + d)n + c

La propiedad BST nos permite imprimir todas las keys de


Por tanto, hemos probado que el tiempo de ejecucin del
* Escuela de Ciencias de la Computacin algoritmo 1 es O(n).

1
2

2. Consultas en un BST Algorithm 4: TREE_MINIMUM(x)


Input: Un nodo x
2.1. Bsqueda Output: Un apuntador al nodo con la menor key
dentro del subrbol que tiene a x como raz
Algorithm 2: TREE_SEARCH(x,k) 1 while x.lef t 6= N IL do

Input: Un nodo x y una key k 2 x = x.lef t


Output: Un apuntador al nodo con key k o N IL en 3 return x
caso de no existir dicho nodo
1 if x = N IL o k = x.key then
2 return x Algorithm 5: TREE_MAXIMUM(x)
3 if k < x.key then Input: Un nodo x
4 return TREE_SEARCH(x.lef t, k) Output: Un apuntador al nodo con la mayor key
dentro del subrbol que tiene a x como raz
5 else
1 while x.right 6= N IL do
6 return TREE_SEARCH(x.right, k)
2 x = x.right
3 return x
Este algoritmo toma gran ventaja de la propiedad BST,
gracias a ello solo necesita comparar el valor de la key
buscada con el valor de la key de x para descartar el hecho sucesor de un nodo sin tener la necesidad de comparar las
de que un nodo con key k pueda estar en el subrbol keys, para ello usamos el procedimiento del algoritmo 6.
izquierdo o derecho de x.

Tambin podemos reescribir este algoritmo como uno ite- Algorithm 6: TREE_SUCCESSOR(x)
rativo. Input: Un nodo x
Output: El sucesor de x
Algorithm 3: ITERATIVE_TREE_SEARCH(x,k) 1 if x.right 6= N IL then

Input: Un nodo x y una key k 2 return TREE_MINIMUM(x.right)


Output: Un apuntador al nodo con key k o N IL en 3 y = x.p
caso de no existir dicho nodo 4 while y 6= N IL y x = y.right do
1 while x 6= N IL y k 6= x.key do 5 x=y
2 if k < x.key then 6 y = y.p
3 x = x.lef t 7 return y
4 else
5 x = x.right
El procedimiento para hallar el predecesor de un nodo es
6 return x simtrico al realizado en el algoritmo 6 para encontrar el
sucesor. Si todas las keys son distintas, el predecesor de un
nodo x es el nodo con la mayor key menor que x.key.

2.2. Mximo y Mnimo


Podemos usar la propiedad BST para encontrar fcilmente 3. Insercin y Eliminacin de Nodos
el nodo con menor o mayor key dentro de un rbol utilizando
los algoritmos 4 y 5 respectivamente. en un BST
Para poder soportar conjuntos dinmicos requerimos de
2.3. Sucesor y Predecesor
operaciones que nos permitan modificar los elementos al-
Dado un nodo en el BST, a veces necesitaremos encontrar macenados en el BST de tal manera que la propiedad BST
su sucesor en el orden determinado por un Inorder Tree se siga cumpliendo. Como veremos a continuacin, la inser-
Walk. Si todas las keys son distintas, el sucesor de x es el cin de un nuevo nodo es sencilla, pero para poder eliminar
nodo con la menor key mayor que x.key. La disposicin de un nodo requeriremos de un procedimiento un poco ms
las keys proporcionada por un BST nos permite encotrar el complejo.
3

3.1. Insercin

Algorithm 7: TREE_INSERT(T , z)
Input: Un rbol T y un nodo z
1 y = N IL
2 x = T.root
3 while x 6= N IL do
4 y=x
5 if z.key < x.key then
6 x = x.lef t
7 else
8 x = x.right

9 z.p = y
10 if y = N IL then
11 T.root = z
12 else
13 if z.key < y.key then
14 y.lef t = z Figura 2: Eliminacin de Nodos - Caso 3. El primer cambio
15 else corresponde al primer subcaso y el segundo cambio corres-
16 y.right = z ponde al segundo subcaso

Si y no es hijo derecho de z, primero reemplazamos


La idea detrs del algoritmo Tree_Insert es la misma que y por su hijo derecho y luego reemplazamos z por y.
la del algoritmo Tree_Search, comienza desde la raz del r-
bol y va descendiendo en el rbol aprovechando la propiedad Para entender un poco mejor el tercer caso, tenemos una
BST para saber fcilmente donde colocar el nuevo nodo. ilustracin de ambos subcasos mencionados en la figura 2.

3.2. Eliminacin Haremo uso de un algoritmo llamado Transplant para po-


der modificar los apuntadores dentro del rbol durante el
La estrategia completa para eliminar un nodo z de un proceso de eliminacin.
BST tiene tres casos bsicos:

1. Si z no tiene hijos, simplemente lo removemos del rbol Algorithm 8: TRANSPLANT(T , u , v)


haciendo que su padre apunte a NIL como hijo en lugar Input: Un rbol T y dos nodos u, v
1 if u.p = N IL then
de apuntar a z.
2 T.root = v
2. Si z tiene un solo hijo, hacemos que este tome su lugar 3 else
en el rbol modificando el padre de z para que apunte 4 if u = u.p.lef t then
al hijo de z como su nuevo hijo. 5 u.p.lef t = v
3. Si z tiene dos hijos, encontramos el sucesor de z (y), el 6 else
cual se encuentra en el subrbol derecho de z, y hace- 7 u.p.right = v
mos que tome la posicin de z en el rbol. Este caso es 8 if v 6= N IL then
un poco difcil pues debemos tener cuidado del caso en 9 v.p = u.p
el que y sea el hijo derecho de z y cuando no lo es.
Si y es el hijo derecho de z, entonces solo remplaza-
mos z con y modificando el padre de z para que apunte El algoritmo 8 reemplaza el subrbol que tiene a u como
a y como su hijo y hacemos que el hijo izquierdo de raz por el subrbol que tiene a v como raz. Usaremos esto
z sea el hijo izquierdo de y, su hijo derecho se queda para implementar el algoritmo de eliminacin de nodos para
intacto. un BST como se muestra en el algoritmo 9.
4

Algorithm 9: TREE_DELETE(T , z) Aleatoriamente como un rbol formado por la insercin


Input: Un rbol T y un nodo z a eliminar de keys de forma aleatoria sobre un rbol inicialmente vaco.
1 if z.lef t = N IL then
2 TRANSPLANT(T, z, z.right) Teorema 1. La altura esperada de un BST construdo
aleatoriamente con n keys distintas es O(log n).
3 else
4 if z.right = N IL then
En la siguiente clase veremos una manera de construr
5 TRANSPLANT(T, z, z.lef t)
rboles que sean siempre buenos, es decir, rbol cuya altura
6 else siempre sea O(log n).
7 y =TREE_MINIMUM(z.right)
8 if y.p 6= z then
9 TRANSPLANT(T, y, y.right)
10 y.right = z.right
11 y.right.p = y
12 TRANSPLANT(T, z, y)
13 y.lef t = z.lef t
14 y.lef t.p = y

Figura 3: Ejemplos de rboles binarios

4. Binary Search Trees Construdos


Aleatoriamente
Como podemos apreciar en la figura 3, existen BSTs
buenos, los cuales son relativamente balanceados con una
altura aproximada a log2 n, y por otro lado tenemos BSTs
malos, con una altura de n, lo cual es malo pues todos los
algoritmos presentados hasta el momento cuentan con un
tiempo de ejecucin dependiente de la altura del rbol. Por
lo que procuraremos que los BSTs que construyamos sean
buenos en la mayora de los casos.

Si el ingreso de datos al BST se da de forma ordenada


(ascendente o descendente), el rbol a formarse resultar
malo. Como hicimos con el quicksort, podemos demostrar
que el comportamiento del caso promedio es ms cercano
al mejor caso que al peor caso. Desafortunadamente,
poco se conoce de la altura promedio de un BST cuando
se usa tanto insercin como eliminacin de nodos pa-
ra crearlo, por tanto definiremos el BST Construdo

También podría gustarte