Árbol Binario de Búsqueda

download Árbol Binario de Búsqueda

of 7

Transcript of Árbol Binario de Búsqueda

  • 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%A9s
  • 7/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/Subrutina
  • 7/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_C
  • 7/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_splay
  • 7/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=90183460