7/26/2019 rbol Binario de Bsqueda
1/7
rbol binario de bsqueda
Unrbol binario de bsqueda tambin llamados BST(acrnimo delinglsBinarySearchTree) es un tipo par-ticular derbol binarioque presenta unaestructura dedatosen forma derbolusada eninformtica.
1 Descripcin
Un rbol binario de bsqueda (ABB) es unrbol binariodefinido de la siguiente forma:
8
3 10
1 6 14
4 7 13
Un rbol binario de bsqueda de tamao 9 y profundidad 3, con
raz 8 y hojas 1, 4, 7 y 13
Para una fcil comprensin queda resumido en que es unrbol binario que cumple que el subrbol izquierdo decualquier nodo (si no est vaco) contiene valores meno-res que el que contiene dicho nodo, y el subrbol derecho(si no est vaco) contiene valores mayores.
Para estas definiciones se considera que hay una relacinde orden establecida entre los elementos de los nodos.Que cierta relacin est definida, o no, depende de cadalenguaje de programacin. De aqu se deduce que pue-de haber distintos rboles binarios de bsqueda para unmismo conjunto de elementos.
La altura h en el peor de los casos es siempre el mis-mo tamao que el nmero de elementos disponibles. Yen el mejor de los casos viene dada por la expresinh = ceil(log2(c+ 1)), donde ceil indica redondeo porexceso.
El inters de los rboles binarios de bsqueda (ABB) ra-dica en que surecorrido en inordenproporciona los ele-mentos ordenados de forma ascendente y en que la bs-
queda de algn elemento suele ser muy eficiente.
Dependiendo de las necesidades del usuario que trate conuna estructura de este tipo, se podr permitir la igualdadestricta en alguno, en ninguno o en ambos de los subr-boles que penden de la raz. Permitir el uso de la igualdadprovoca la aparicin de valores dobles y hace la bsquedams compleja.
Un rbol binario de bsqueda no deja de ser un caso par-ticular de rbol binario, as usando la siguiente especifi-
cacin de rbol binario enmaude:fmod ARBOL-BINARIO {X :: TRIV}is sorts Arbol-BinNV{X} ArbolBin{X} .subsortArbolBinNV{X} Arbol-Bin{X} [ctor] .op arbolBin : X$Elt ArbolBin{X} Ar-bolBin{X} -> ArbolBinNV{X} [ctor] .endfm
podemos hacer la siguiente definicin para un rbol bina-rio de bsqueda (tambin en maude):
fmod ARBOL-BINARIO-BUSQUEDA {X :: OR-DEN}is protecting ARBOL-BINARIO{VOrden}{X}.sortsABB{X} ABBNV{X} .subsortABBNV{X} ArbolBin{X} [ctor] . oparbolBin : X$Elt ArbolBin{X} ArbolBin{X} -> Arbol-BinNV{X} [ctor] .endfm
con la siguienteteoradeorden:
fthORDENis protectingBOOL .sortElt .*** opera-ciones op_ Bool .endfth
para que un rbol binario pertenezca al tipo rbol bina-rio de bsqueda debe cumplir la condicin de ordenacinsiguiente que ira junto al mdulo ARBOL-BINARIO-BUSQUEDA:
varR : X$Elt .varsINV DNV : ABBNV{X} .varsI D: ABB{X} .mbcrear : ABB{X} .mbarbolBin(R, crear,crear) : ABBNV{X} . cmbarbolBin(R, INV, crear) :ABBNV{X}ifR > max(INV) .cmbarbolBin(R, crear,DNV) : ABBNV{X} if R < min(DNV) . cmbarbol-Bin(R, INV, DNV) : ABBNV{X} if (R > max(INV)) and(R < min(DNV)) .opsmin max : ABBNV{X} -> X$Elt. eq min(arbolBin(R, crear, D)) = R . eq min(arbolBin(R,INV, D)) = min(INV) . eqmax(arbolBin(R, I, crear)) =R .eqmax(arbolBin(R, I, DNV)) = max(DNV) .
1
https://es.wikipedia.org/wiki/Ordenhttps://es.wikipedia.org/wiki/Teor%C3%ADahttps://es.wikipedia.org/wiki/Maudehttps://es.wikipedia.org/wiki/%C3%81rbol_binariohttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttps://es.wikipedia.org/wiki/%C3%81rbol_binariohttps://es.wikipedia.org/wiki/Inform%C3%A1ticahttps://es.wikipedia.org/wiki/%C3%81rbol_(estructura_de_datos)https://es.wikipedia.org/wiki/Estructura_de_datoshttps://es.wikipedia.org/wiki/Estructura_de_datoshttps://es.wikipedia.org/wiki/%C3%81rbol_binariohttps://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s7/26/2019 rbol Binario de Bsqueda
2/7
2 3 OPERACIONES
2 Implementacin en Python
class nodo: izq , der, dato = None, None, 0 def__init__(self, dato): # crea un nodo self.izq = Noneself.der = None self.dato = datoclass arbolBinario: def __init__(self): # inicializa laraiz self.raiz = None def agregarNodo(self, dato): #crea un nuevo nodo y lo devuelve return nodo(dato) definsertar(self, raiz, dato): # inserta un dato nuevo en elrbol if raiz == None: # si no hay nodos en el rbollo agrega return self.agregarNodo(dato) else: # si haynodos en el rbol lo recorre if dato k!=k) ) { if (k < p->k) { p=p->l; } if (p->k r; } } if (!estaVacio(p) &&(p->d!=NULL) ){ e=copiaDato(p->d); } } return e; }
Vase ahora la versin recursiva en ese mismo lenguaje:
int buscar(tArbol *a, int elem) { if (a == NULL) {
return 0; } else if (a->clave < elem) { return buscar(a->hDerecho, elem); } else if (a->clave > elem) { returnbuscar(a->hIzquierdo, elem); } else { return 1; } }
Otro ejemplo enPython:
def buscar(raiz, clave): # busca el valor clave dentro delarbol if raiz == None: print 'No se encuentra' else: # ifclave == raiz.dato: print 'El valor ',clave,' se encuentraen el ABB' elif clave < raiz.dato: # lado izquierdoreturn buscar(raiz.izq, clave) else: # lado derecho returnbuscar(raiz.der, clave)
EnPascal:
Function busqueda(T:ABR, y: integer):ABR beginif (T=nil) or (^T.raiz=y) then busqueda:=T; else if(^T.raiz Bool .varR R1 R2 : X$Elt. vars I D : ABB{X} . eq esta?(R, crear) = false . eq
esta?(R1, arbolBin(R2, I, D)) =ifR1 == R2then trueelse ifR1 < R2thenesta?(R1, I)else esta?(R1, D)fi fi.
3.2 Insercin
La insercin es similar a la bsqueda y se puede dar unasolucin tanto iterativa como recursiva. Si tenemos ini-cialmente comoparmetroun rbol vaco se crea un nue-vo nodo como nico contenido el elemento a insertar. Sino lo est, se comprueba si elelemento dado es menor quela raz del rbol inicial con lo que se inserta en el subrbol
izquierdo y si es mayor se inserta en el subrbol derecho.4
3 16
10 20
127 7 12
10 20
163
4 4 4 4
3 16
10 20
127
3 16
10 20
127
3 16
10 20
127
55
5
5
5
Evolucin de la insercin del elemento 5 en un ABB.
Como en el caso de la bsqueda puede haber varias va-riantes a la hora de implementar la insercin en el TAD(Tipo Abstracto de Datos), y es la decisin a tomar cuan-
do el elemento (o clave del elemento) a insertar ya seencuentra en el rbol, puede que ste sea modificado oque sea ignorada la insercin. Es obvio que esta opera-
https://es.wikipedia.org/wiki/Argumento_(Ciencias_de_la_computaci%C3%B3n)https://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Pascalhttps://es.wikipedia.org/wiki/Pythonhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Chttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Chttps://es.wikipedia.org/wiki/Logaritmohttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3nhttps://es.wikipedia.org/wiki/Subrutina7/26/2019 rbol Binario de Bsqueda
3/7
3.3 Borrado 3
cin modifica el ABB perdiendo la versin anterior delmismo.
A continuacin se muestran las dos versiones del algorit-mo enpseudolenguaje, iterativa y recursiva, respectiva-mente.
PROC InsertarABB(rbol:TABB; dato:TElemento)VARIABLES nuevonodo,pav,pret:TABB clavenueva:Tclave ele:TElemento INICIO nuevonodo
7/26/2019 rbol Binario de Bsqueda
4/7
4 3 OPERACIONES
El siguiente algoritmo en C realiza el borrado en un ABB.El procedimiento reemplazarbusca la mayor clave delsubrbol izquierdo y la asigna al nodo a eliminar.
void reemplazar(tArbol **a, tArbol **aux); /*Prototipode la funcion ''reemplazar''*/ void borrar(tArbol **a,
int elem) { tArbol *aux; if (*a == NULL) return; if((*a)->clave < elem) borrar(&(*a)->hDerecho, elem);else if ((*a)->clave > elem) borrar(&(*a)->hIzquierdo,elem); else if ((*a)->clave == elem) { aux = *a; if((*a)->hIzquierdo == NULL) *a = (*a)->hDerecho; elseif ((*a)->hDerecho == NULL) *a = (*a)->hIzquierdo;else reemplazar(&(*a)->hIzquierdo, &aux); free(aux);} } void reemplazar(tArbol **a, tArbol **aux) {if ((*a)->hDerecho == NULL) { (*aux)->clave =(*a)->clave; *aux = *a; *a = (*a)->hIzquierdo; } elsereemplazar(&(*a)->hDerecho, & aux); }
Otro ejemplo enPascal.Procedure Borrar(var T:ABR, x:ABR) var aBorrar:ABR;anterior:ABR; actual:ABR; hijo:ABR; begin if(^x.izq=nil) or (^x.dch=nil) then aBorrar:=x; elseaBorrar:=sucesor(T,x); actual:=T; anterior:=nil; while(actualaBorrar) do begin anterior:=actual; if (^ac-tual.raiz X$Elt .eqmin(arbolBin(R, crear, D)) = R . eqmax(arbolBin(R, I,crear)) = R .eqmin(arbolBin(R, INV, D)) = min(INV).eq max(arbolBin(R, I, DNV )) = max(DNV) . eq eli-
minar(M, crear) = crear . ceq eliminar(M, arbolBin(R,crear, D)) = DifM == clave(R) .ceqeliminar(M, arbol-Bin(R, I, crear)) = IifM == clave(R) .ceqeliminar(M,arbolBin(R, INV, DNV)) = arbolBin(max(INV), elimi-nar(clave(max(INV)), INV), DNV)if M == clave(R) .ceqeliminar(M, arbolBin(R, I, D)) = arbolBin(R, elimi-nar(M, I), D)if M < clave(R) . ceq eliminar(M, arbol-Bin(R, I, D)) = arbolBin(R, I, eliminar(M, D)) if clave(R)< M .
3.4 Otras Operaciones
Otra operacin sera por ejemplo comprobar que un rbolbinario es un rbol binario de bsqueda. Su implementa-
cin en maude es la siguiente:
op esABB? : ABB{X} -> Bool . var R : X$Elt .vars I D : ABB{X} . eq esABB?(crear) = true . eqesABB?(arbolbBin(R, I, D)) = (Max(I) < R) and (Min(D)> R) and (esABB?(I)) and (esABB?(D)) .
3.5 Recorridos
Se puede hacer un recorrido de un rbol en profundidado en anchura.
Los recorridos en anchura son por niveles, se realiza hori-zontalmente desde la raz a todos los hijos antes de pasara la descendencia de alguno de los hijos.
El coste de recorrer el ABB es O(n), ya que se necesitanvisitar todos los vrtices.
El recorrido en profundidad lleva al camino desde la razhacia el descendiente ms lejano del primer hijo y luegocontina con el siguiente hijo. Como recorridos en pro-fundidad tenemosinorden,preordenypostorden.
Una propiedad de los ABB es que al hacer un recorrido enprofundidad inorden obtenemos los elementos ordenadosde forma ascendente.
Ejemplo rbol binario de bsqueda
Resultado de hacer el recorrido en:
Inorden= [6, 9, 13, 14, 15, 17, 20, 26, 64, 72].
Preorden= [15, 9, 6, 14, 13, 20, 17, 64, 26, 72].
Postorden=[6, 13, 14, 9, 17, 26, 72, 64, 20, 15].
Recorridos en Visual Basic .Net'funcin de recorrido en PREORDEN Public Functionpreorden() As String cadenasalida = "" rePreorden(raz)Return cadenasalida End Function Private Sub rePreor-den(ByVal padre As Nodo) If IsNothing(padre) ThenReturn End If cadenasalida = cadenasalida & "-" &padre.dato rePreorden(padre.ant) rePreorden(padre.sig)End Sub 'funcin de recorrido en POSTORDEN Pu-blic Function postorden() As String cadenasalida = ""reposorden(raz) Return cadenasalida End Function Pri-vate Sub repostorden(ByVal padre As Nodo) If IsNot-hing(padre) Then Return End If repostorden(padre.ant)
repostorden(padre.sig) cadenasalida = cadenasalida & "-"& padre.dato End Sub 'funcin de recorrido en ENOR-DEN Public Function inorden() As String cadenasalida
https://meta.wikimedia.org/wiki/w:es:%25C3%2581rbol_binario#Recorrido_en_postordenhttps://meta.wikimedia.org/wiki/w:es:%25C3%2581rbol_binario#Recorrido_en_preordenhttps://meta.wikimedia.org/wiki/w:es:%25C3%2581rbol_binario#Recorrido_en_inordenhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_Pascalhttps://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C7/26/2019 rbol Binario de Bsqueda
5/7
5
= "" reinorden(raz) Return cadenasalida End FunctionPrivate Sub reinorden(ByVal padre As Nodo) If IsNot-hing(padre) Then Return End If reinorden(padre.ant) ca-denasalida = cadenasalida & "-" & padre.dato reinor-den(padre.sig) End Sub
Recorridos enCcon funciones recursivasstruct Nodo{ char nombre[30]; struct Nodo *izq; structNodo *der; }; typedef struct Nodo Nodo; typedefNodo *Arbol; void preOrden(Arbol abb){ if(abb) {printf("%s\n, abb->nombre); preOrden(abb->izq);preOrden(abb->der); } } void postOrden(Arbol abb){if(abb) { postOrden(abb->izq); postOrden(abb->der);printf("%s\n, abb->nombre); } } void inOrden(Arbolabb){ if(abb) { inOrden(abb->izq); printf("%s\n,abb->nombre); inOrden(abb->der); } }
4 Tipos de rboles binarios de bs-queda
Hay varios tipos de rboles binarios de bsqueda. Losrboles AVL,rbol rojo-negro, son rboles autobalancea-bles . Losrbol biseladoson rboles tambin autobalan-ceables con la propiedad de que los elementos accedidosrecientemente se acceder ms rpido en posteriores ac-cesos. En el montculo, como en todos los rboles binariosde bsqueda, cada nodo padre tiene un valor mayor quesus hijos y adems es completo, esto es cuando todos los
niveles estn llenos con excepcin del ltimo que puedeno estarlo. Por ltimo, en lo montculos con prioridad ca-da nodo mantiene una prioridad y siempre un nodo padretendr una prioridad mayor a la de su hijo.
Otras dos maneras de configurar un rbol binario de bs-queda podra ser como un rbol completo o degenerado.
Unrbol completoes un rbol con n niveles, donde cadanivel d
7/26/2019 rbol Binario de Bsqueda
6/7
6 9 ENLACES EXTERNOS
rbol Splay
rbol Multirrama
8 Referencias
[1] Heger, Dominique A. (2004), A Disquisition on ThePerformance Behavior of Binary Search Tree Data Struc-tures,European Journal for the Informatics Professional5(5)
9 Enlaces externos
rboles binarios de bsqueda en Google
Implementacin de rboles binarios de bsqueda en
distintos lenguajes Aplicacin JAVA de rboles
http://people.ksp.sk/~kuko/bak/index.htmlhttp://en.literateprograms.org/Binary_search_tree_%2528C%2529http://en.literateprograms.org/Binary_search_tree_%2528C%2529https://www.google.com/search?q=arbol%2520binario%2520de%2520busquedahttp://www.cepis.org/upgrade/files/full-2004-V.pdfhttp://www.cepis.org/upgrade/files/full-2004-V.pdfhttp://www.cepis.org/upgrade/files/full-2004-V.pdfhttps://es.wikipedia.org/wiki/%C3%81rbol_multirramahttps://es.wikipedia.org/wiki/%C3%81rbol_splay7/26/2019 rbol Binario de Bsqueda
7/7
7
10 Origen del texto y las imgenes, colaboradores y licencias
10.1 Texto
rbol binario de bsqueda Fuente:https://es.wikipedia.org/wiki/%C3%81rbol_binario_de_b%C3%BAsqueda?oldid=90183460Cola-boradores:Hashar, Zwobot, Porao, Chewie, FAR, LeonardoRob0t, Orgullobot~eswiki, Platonides, Yrbot, BOT-Superzerocool, Vitamine,YurikBot, Er Komandante, Fercufer, CEM-bot, Thijs!bot, BotOn, JAnDbot, Albries, NaBUru38, Rei-bot, Tirabo, 3coma14, Muro Bot,YonaBot, SieBot, Knzio, Drinibot, Bigsus-bot, BOTarate, Andresluna2007, Aluna2007, PixelBot, Leonpolanco, ErSame, Joanga, Lolybc15~eswiki, Apj, BotSottile, AVBOT, MastiBot, Ciberjovial, Luckas-bot, Alelapenya, SuperBraulio13, Xqbot, Ricardogpn, Bot0811,ViajeroEspacial, Yago AB, Mr.Ajedrez, Ripchip Bot, Humbefa, , Invadibot, Bibliofilotranstornado, MetalGuns, Maucendon, Dark-meow, Wjuarezq, Addbot, Kimizombie, Jarould y Annimos: 48
10.2 Imgenes
Archivo:ABBEJEM_vector.svg Fuente:https://upload.wikimedia.org/wikipedia/commons/c/c2/ABBEJEM_vector.svg Licencia:CC0Colaboradores:Trabajo propioArtista original:
Archivo:ABBHOJA3_vector.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/d/d4/ABBHOJA3_vector.svg Licencia:CC0Colaboradores:Trabajo propio Artista original:
Archivo:ABBHOJA4_vector.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/6f/ABBHOJA4_vector.svg Licencia:CC0Colaboradores:Trabajo propio Artista original:
Archivo:ABBHOJA5_vector.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/b/bb/ABBHOJA5_vector.svg Licencia:CC0Colaboradores:Trabajo propio Artista original:
Archivo:Binary_search_tree.svg Fuente:https://upload.wikimedia.org/wikipedia/commons/d/da/Binary_search_tree.svg Licencia:Pu-blic domain Colaboradores:No machine-readable source provided. Own work assumed (based on copyright claims). Artista original:Nomachine-readable author provided.Dcoetzeeassumed (based on copyright claims).
Archivo:Insertar.svg Fuente:https://upload.wikimedia.org/wikipedia/commons/c/c0/Insertar.svg Licencia:Public domain Colaborado-res:Trabajo propio Artista original:Gorivero
10.3 Licencia del contenido
Creative Commons Attribution-Share Alike 3.0
https://creativecommons.org/licenses/by-sa/3.0/http://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:Goriverohttps://upload.wikimedia.org/wikipedia/commons/c/c0/Insertar.svghttp://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:Dcoetzeehttps://upload.wikimedia.org/wikipedia/commons/d/da/Binary_search_tree.svghttp://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:%25D0%259B%25D0%25B5_%25D0%259B%25D0%25BE%25D0%25B9https://upload.wikimedia.org/wikipedia/commons/b/bb/ABBHOJA5_vector.svghttp://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:%25D0%259B%25D0%25B5_%25D0%259B%25D0%25BE%25D0%25B9https://upload.wikimedia.org/wikipedia/commons/6/6f/ABBHOJA4_vector.svghttp://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:%25D0%259B%25D0%25B5_%25D0%259B%25D0%25BE%25D0%25B9https://upload.wikimedia.org/wikipedia/commons/d/d4/ABBHOJA3_vector.svghttp://localhost/var/www/apps/conversion/tmp/scratch_3//commons.wikimedia.org/wiki/User:%25D0%259B%25D0%25B5_%25D0%259B%25D0%25BE%25D0%25B9https://upload.wikimedia.org/wikipedia/commons/c/c2/ABBEJEM_vector.svghttps://es.wikipedia.org/wiki/%25C3%2581rbol_binario_de_b%25C3%25BAsqueda?oldid=90183460Top Related