arboles binarios

Upload: velkan-gael-valerius-aleman

Post on 13-Jul-2015

2.048 views

Category:

Documents


0 download

TRANSCRIPT

ContenidosArtculosrbol (informtica) rbol binario rbol binario de bsqueda Bsqueda en anchura Bsqueda en profundidad Montculo (informtica) 1 3 9 22 24 25

ReferenciasFuentes y contribuyentes del artculo Fuentes de imagen, Licencias y contribuyentes 29 30

Licencias de artculosLicencia 31

rbol (informtica)

1

rbol (informtica)Este artculo o seccin necesita referencias que aparezcan en una publicacin acreditada, como revistas especializadas, monografas, prensa diaria o pginas de Internet fidedignas. [1] Puedes aadirlas as o avisar al autor principal del artculo en su pgina de discusin pegando: {{subst:Aviso referencias|rbol (informtica)}} ~~~~

En ciencias de la informtica, un rbol es una estructura de datos ampliamente usada que imita la forma de un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el rbol y puede tener cero o ms nodos hijos conectados a l. Se dice que un nodo es padre de un nodo si existe un enlace desde hasta (en ese caso, tambin decimos que es hijo de ). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo que no tiene hijos se conoce como hoja. Los dems nodos (tienen padre y uno o varios hijos) se les conoce como rama.

DefinicinFormalmente, podemos definir un rbol de la siguiente forma: Caso base: un rbol con slo un nodo (es a la vez raz del rbol y hoja). Un nuevo rbol a partir de un nodo una de las races de los nodo , los nodos y rboles de races con y cada nodos tiene como raz el y el conjunto de nodos hoja est formado por la unin

elementos cada uno, puede construirse estableciendo una relacin padre-hijo entre rboles. El rbol resultante de son los hijos de

de los conjuntos hojas iniciales. A cada uno de los rboles se les denota ahora subrboles de la raz. Una sucesin de nodos del rbol, de forma que entre cada dos nodos consecutivos de la sucesin haya una relacin de parentesco, decimos que es un recorrido rbol. Existen dos recorridos tpicos para listar los nodos de un rbol: primero en profundidad y primero en anchura. En el primer caso, se listan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo anterior probando por el siguiente hijo y as sucesivamente. En el segundo, por su parte, antes de listar los nodos de nivel (a distancia aristas de la raz), se deben haber listado todos los de nivel inorden: . Otros recorridos tpicos del rbol son preorden, postorden e

El recorrido en preorden, tambin llamado orden previo consiste en recorrer en primer lugar la raz y luego cada uno de los hijos en orden previo. El recorrido en inorden, tambin llamado orden simtrico (aunque este nombre slo cobra significado en los rboles binarios) consiste en recorrer en primer lugar , luego la raz y luego cada uno de los hijos en orden simtrico. El recorrido en postorden, tambin llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos en orden posterior y por ltimo la raz. Finalmente, puede decirse que esta estructura es una representacin del concepto de rbol en teora de grafos. Un rbol es un grafo conexo y acclico (ver tambin teora de grafos y Glosario en teora de grafos).

rbol (informtica)

2

Tipos de rboles rboles Binarios rbol de bsqueda binario auto-balanceable rboles AVL rboles Rojo-Negro rbol AA rboles Multicamino rboles B (Arboles de bsqueda multicamino autobalanceados) rbol-B+ rbol-B*Ejemplo de rbol (binario).

Operaciones de rboles. RepresentacinLas operaciones comunes en rboles son: Enumerar todos los elementos. Buscar un elemento. Dado un nodo, listar los hijos (si los hay). Borrar un elemento. Eliminar un subrbol (algunas veces llamada podar). Aadir un subrbol (algunas veces llamada injertar). Encontrar la raz de cualquier nodo.

Por su parte, la representacin puede realizarse de diferentes formas. Las ms utilizadas son: Representar cada nodo como una variable en el heap, con punteros a sus hijos y a su padre. Representar el rbol con un array donde cada elemento es un nodo y las relaciones padre-hijo vienen dadas por la posicin del nodo en el array.

Uso de los rbolesUsos comunes de los rboles son: Representacin de datos jerrquicos. Como ayuda para realizar bsquedas en conjuntos de datos (ver tambin: algoritmos de bsqueda en rboles).

Vase tambin Particin binaria del espacio Heap rbol (teora de grafos) Estructura de un rbol rbol exponencial

rbol (informtica)

3

Algoritmos de bsqueda en rboles Bsqueda en profundidad Bsqueda en anchura Algoritmo de bsqueda A*

Referencias[1] http:/ / en. wikipedia. org/ wiki/ %C3%81rbol_%28inform%C3%A1tica%29?action=history

rbol binarioEn ciencias de la computacin, un rbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener ms de dos hijos (de ah el nombre "binario"). Si algn hijo tiene como referencia a null, es decir que no almacena ningn dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los rboles binarios son los rboles binarios de bsqueda, los montculos binarios y Codificacin de Huffman.

Definicin de teora de grafosEn teora de grafos, se usa la siguiente definicin: Un rbol binario es un grafo conexo, acclico y no dirigido tal que el grado de cada vrtice no es mayor a 3. De esta forma slo existe un camino entre un par de nodos. Un rbol binario con enraizado es como un grafo que tiene uno de sus vrtices, llamado raz, de grado no mayor a 2. Con la raz escogida, cada vrtice tendr un nico padre, y nunca ms de dos hijos. Si rehusamos el requerimiento de la conectividad, permitiendo mltiples componentes conectados en el grafo, llamaremos a esta ltima estructura un bosque.

Tipos de rboles binarios Un rbol binario es un rbol con raz en el que cada nodo tiene como mximo dos hijos.

Un rbol binario sencillo de tamao 9, 4 niveles y altura 3 (altura = mximo nivel - 1), con un nodo raz cuyo valor es 2.

Un rbol binario lleno es un rbol en el que cada nodo tiene cero o dos hijos. Un rbol binario perfecto es un rbol binario lleno en el que todas las hojas (vrtices con cero hijos) estn a la misma profundidad (distancia desde la raz, tambin llamada altura). A veces un rbol binario perfecto es denominado rbol binario completo. Otros definen un rbol binario completo como un rbol binario lleno en el que todas las hojas estn a profundidad n o n-1, para alguna n. Un rbol binario es un rbol en el que ningn nodo puede tener ms de dos subrboles. En un rbol binario cada nodo puede tener cero, uno o dos hijos (subrboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho.

rbol binario

4

Implementacin en CUn rbol binario puede declararse de varias maneras. Algunas de ellas son: Estructura con manejo de memoria dinmica, siendo puntA el puntero que apunta al rbol de tipo tArbol: typedef struct nodo { int clave; struct nodo *izdo, *dcho; }Nodo; Estructura con arreglo indexado: typedef struct tArbol { int clave; tArbol hIzquierdo, hDerecho; } tArbol; tArbol rbol[NUMERO_DE_NODOS]; En el caso de un rbol binario casi-completo (o un rbol completo), puede utilizarse un sencillo arreglo de enteros con tantas posiciones como nodos deba tener el rbol. La informacin de la ubicacin del nodo en el rbol es implcita a cada posicin del arreglo. As, si un nodo est en la posicin i, sus hijos se encuentran en las posiciones 2i+1 y 2i+2, mientras que su padre (si tiene), se encuentra en la posicin truncamiento((i-1)/2) (suponiendo que la raz est en la posicin cero). Este mtodo se beneficia de un almacenamiento ms compacto y una mejor localidad de referencia, particularmente durante un recorrido en preorden. La estructura para este caso sera por tanto: int rbol[NUMERO_DE_NODOS];

Recorridos sobre rboles binariosRecorridos en profundidadEl mtodo de este recorrido es tratar de encontrar de la cabecera a la raz en nodo de unidad binaria. Ahora pasamos a ver la implementacin de los distintos recorridos: Recorrido en preorden En este tipo de recorrido se realiza cierta accin (quizs simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subrbol izquierdo y cuando se haya concluido, el subrbol derecho. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierda, nodo derecha. En el rbol de la figura el recorrido en preorden sera: 2, 7, 2, 6, 5, 11, 5, 9 y 4. void preorden(tArbol *a) { if (a != NULL) { tratar(a); preorden(a->hIzquierdo); preorden(a->hDerecho); } } Implementacin en pseudocdigo de forma iterativa:

//Realiza una operacin en nodo

rbol binariopush(s,NULL); push(s,raz); MIENTRAS (s NULL) HACER p = pop(s); tratar(p); SI (D(p) NULL) ENTONCES push(s,D(p)); FIN-SI SI (I(p) NULL) ENTONCES push(s,I(p)); FIN-SI FIN-MIENTRAS //preguntamos si p tiene rbol izquierdo //sacamos un elemento de la pila //realizamos operaciones sobre el nodo p //preguntamos si p tiene rbol derecho //insertamos en una pila (stack) el valor NULL, para asegurarnos de que est vaca //insertamos el nodo raz

5

Recorrido en postorden En este caso se trata primero el subrbol izquierdo, despus el derecho y por ltimo el nodo actual. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda, nodo derecha, nodo raiz. En el rbol de la figura el recorrido en postorden sera: 2, 5, 11, 6, 7, 4, 9, 5 y 2. void postorden(tArbol *a) { if (a != NULL) { postorden(a->hIzquiedo); postorden(a->hDerecho); tratar(a); } } Recorrido en inorden En este caso se trata primero el subrbol izquierdo, despus el nodo actual y por ltimo el subrbol derecho. En un ABB este recorrido dara los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha. En el rbol de la figura el recorrido en inorden sera: 2, 7, 5, 6, 11, 2, 5, 4, 9. Esquema de implementacin: void inorden(tArbol *a) { if (a != NULL) { inorden(a->hIzquierdo); tratar(a); inorden(a->hDerecho); } }

//Realiza una operacin en nodo

//Realiza una operacin en nodo

rbol binario

6

Recorridos en amplitud (o por niveles)En este caso el recorrido se realiza en orden por los distintos niveles del rbol. As, se comenzara tratando el nivel 1, que slo contiene el nodo raz, seguidamente el nivel 2, el 3 y as sucesivamente. En el rbol de la figura el recorrido en amplitud sera: 2, 7, 5, 2, 6, 9, 5, 11 y 4. Al contrario que en los mtodos de recorrido en profundidad, el recorrido por niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para recordar los subrboles izquierdos y derecho de cada nodo. El esquema algoritmo para implementar un recorrido por niveles es exactamente el mismo que el utilizado en la versin iterativa del recorrido en preorden pero cambiando la estructura de datos que almacena los nodos por una cola. Implementacin en C: void arbol_recorrido_anch (tipo_Arbol* A) { tipo_Cola cola_nodos; // esta cola esta implementada previamente, almacena punteros (posiciones de nodos de arbol) tipo_Pos nodo_actual; // este es un puntero llevara el recorrido if (vacio(A)) // sie el arbol esta vacio, salimos return; cola_inicializa(&cola_nodos); // obvio, y necesario cola_enqueue(A, &cola_nodos); // se encola la raiz while (!vacia(&cola_nodos)) { // mientras la cola no se vacie se realizara el recorrido nodo_actual = cola_dequeue(&cola_nodos) // de la cola saldran los nodos ordenados por nivel printf("%c,", nodo_actual->info); // se "procesa" el nodo donde va el recorrido, en este caso se imprime if (nodo_actual->izq != null) // si existe, ponemos el hijo izquierdo en la cola cola_enqueue(nodo_actual->izq, &cola_nodos); if (nodo_actual->der != null) // si existe, ponemos el hijo derecho en la cola cola_enqueue(nodo_actual->der, &cola_nodos); } // al vaciarse la cola se han visitado todos los nodos del arbol }

rbol binario

7

Mtodos para almacenar rboles binariosLos rboles binarios pueden ser construidos a partir de lenguajes de programacin de varias formas. En un lenguaje con registros y referencias, los rboles binarios son construidos tpicamente con una estructura de nodos y punteros en la cual se almacenan datos, cada uno de estos nodos tiene una referencia o puntero a un nodo izquierdo y a un nodo derecho denominados hijos. En ocasiones, tambin contiene un puntero a un nico nodo. Si un nodo tiene menos de dos hijos, algunos de los punteros de los hijos pueden ser definidos como nulos para indicar que no dispone de dicho nodo. En la figura adjunta se puede observar la estructura de dicha implementacin.

Los rboles binarios tambin pueden ser almacenados como una estructura de datos implcita en vectores, y si el rbol es un rbol binario completo, este mtodo no desaprovecha el espacio en memoria. Tomaremos como notacin la siguiente: si un nodo tiene un ndice i, sus hijos se encuentran en ndices 2i + 1 y 2i + 2, mientras que sus padres (si los tiene) se encuentra en el ndice (partiendo de que la raz tenga ndice cero). Este mtodo tiene como

ventajas el tener almacenados los datos de forma ms compacta y por tener una forma ms rpida y eficiente de localizar los datos en particular durante un preoden transversal. Sin embargo, desperdicia mucho espacio en memoria.

rbol binario

8

Codificacin de rboles n-arios como rboles binariosHay un mapeo uno a uno entre los rboles generales y rboles binarios, el cual en particular es usado en Lisp para representar rboles generales como rboles binarios. Cada nodo N ordenado en el rbol corresponde a un nodo N 'en el rbol binario; el hijo de la izquierda de N es el nodo correspondiente al primer hijo de N, y el hijo derecho de N' es el nodo correspondiente al siguiente hermano de N, es decir, el prximo nodo en orden entre los hijos de los padres de N. Esta representacin como rbol binario de un rbol general, se conoce a veces como un rbol binario primer hijo hermano, o un rbol doblemente encadenado. Una manera de pensar acerca de esto es que los hijos de cada nodo estn en una lista enlazada, encadenados junto con el campo derecho, y el nodo slo tiene un puntero al comienzo o la cabeza de esta lista, a travs de su campo izquierdo. Por ejemplo, en el rbol de la izquierda, la A tiene 6 hijos (B, C, D, E, F, G). Puede ser convertido en el rbol binario de la derecha. Un ejemplo de transformar el rbol n-ario a un rbol binario cmo pasar de rboles n-arios a rboles FLOFO. El rbol binario puede ser pensado como el rbol original inclinado hacia los lados, con los bordes negros izquierdos representando el primer hijo y los azules representado los siguientes hermanos. Las hojas del rbol de la izquierda seran escritas en Lisp como: (((M N) H I) C D ((O) (P)) F (L)) Que se ejecutar en la memoria como el rbol binario de la derecha, sin ningn tipo de letras en aquellos nodos que tienen un hijo izquierdo. rbol (estructura de datos) rbol multirrama rbol binario de bsqueda rbol de Fibonacci Particin de espacio binario rbol binario de bsqueda en PHP [1]

Referencias[1] http:/ / mmengineer. blogspot. com/ 2007/ 10/ aboles-binarios-de-busqueda-php. html

rbol binario de bsqueda

9

rbol binario de bsquedaUn rbol binario de bsqueda es un tipo particular de rbol binario que presenta una estructura de datos en forma de rbol usada en informtica.

DescripcinUn rbol binario de bsqueda (ABB) es un rbol binario definido de la siguiente forma:Todo rbol vaco es un rbol binario de bsqueda. Un rbol binario no vaco, de raz R, es un rbol binario de bsqueda si: En caso de tener subrbol izquierdo, la raz R debe ser mayor que el valor mximo almacenado en el subrbol izquierdo, y que el subrbol izquierdo sea un rbol binario de bsqueda. En caso de tener subrbol derecho, la raz R debe ser menor que el valor mnimo almacenado en el subrbol derecho, y que el subrbol derecho sea un rbol binario de bsqueda.

Para una fcil comprensin queda resumido en que es un rbol binario que cumple que el subrbol izquierdo de cualquier nodo (si no est vaco) contiene valores menores 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 relacin de orden establecida entre los elementos de los nodos. Que cierta relacin est definida, o no, depende de cada lenguaje de programacin. De aqu se deduce que puede haber distintos rboles binarios de bsqueda para un mismo conjunto de elementos.

Un rbol binario de bsqueda de tamao 9 y profundidad 3, con raz 8 y hojas 1, 4, 7 y 13

La altura h en el peor de los casos siempre el mismo tamao que el nmero de elementos disponibles. Y en el mejor de los casos viene dada por la expresin , donde ceil indica redondeo por exceso. El inters de los rboles binarios de bsqueda (ABB) radica en que su recorrido en inorden proporciona los elementos ordenados de forma ascendente y en que la bsqueda de algn elemento suele ser muy eficiente. Dependiendo de las necesidades del usuario que trate con una estructura de este tipo se podr permitir la igualdad estricta en alguno, en ninguno o en ambos de los subrboles que penden de la raz. Permitir el uso de la igualdad provoca la aparicin de valores dobles y hace la bsqueda ms compleja. Un rbol binario de bsqueda no deja de ser un caso particular de rbol binario, as usando la siguiente especificacin de rbol binario en maude:

rbol binario de bsqueda fmod ARBOL-BINARIO {X :: TRIV}is sorts ArbolBinNV{X} ArbolBin{X} . subsort ArbolBinNV{X} < ArbolBin{X} . *** generadores op crear : -> ArbolBin{X} [ctor] . op arbolBin : X$Elt ArbolBin{X} ArbolBin{X} -> ArbolBinNV{X} [ctor] . endfm podemos hacer la siguiente definicin para un rbol binario de bsqueda (tambin en maude): fmod ARBOL-BINARIO-BUSQUEDA {X :: ORDEN} is protecting ARBOL-BINARIO{VOrden}{X} . sorts ABB{X} ABBNV{X} . subsort ABBNV{X} < ABB{X} . subsort ABB{X} < ArbolBin{VOrden}{X} . subsort ABBNV{X} < ArbolBinNV{VOrden}{X} . *** generadores op crear : -> ArbolBin{X} [ctor] . op arbolBin : X$Elt ArbolBin{X} ArbolBin{X} -> ArbolBinNV{X} [ctor] . endfm con la siguiente teora de orden: fth ORDEN is protecting BOOL . sort Elt . *** operaciones op _ Bool . endfth para que un rbol binario pertenezca al tipo rbol binario de bsqueda debe cumplir la condicin de ordenacin siguiente que ira junto al mdulo ARBOL-BINARIO-BUSQUEDA: var R : X$Elt . vars INV DNV : ABBNV{X} . vars I D : ABB{X} . mb crear : ABB{X} . mb arbolBin(R, crear, crear) : ABBNV{X} . cmb arbolBin(R, INV, crear) : ABBNV{X} if R > max(INV) . cmb arbolBin(R, crear, DNV) : ABBNV{X} if R < min(DNV) . cmb arbolBin(R, INV, DNV) : ABBNV{X} if (R > max(INV)) and (R < min(DNV)) . ops min max : ABBNV{X} -> X$Elt . eq min(arbolBin(R, crear, D)) = R . eq min(arbolBin(R, INV, D)) = min(INV) . eq max(arbolBin(R, I, crear)) = R . eq max(arbolBin(R, I, DNV)) = max(DNV) .

10

rbol binario de bsqueda

11

OperacionesTodas las operaciones realizadas sobre rboles binarios de bsqueda estn basadas en la comparacin de los elementos o clave de los mismos, por lo que es necesaria una subrutina, que puede estar predefinida en el lenguaje de programacin, que los compare y pueda establecer una relacin de orden entre ellos, es decir, que dados dos elementos sea capaz de reconocer cual es mayor y cual menor. Se habla de clave de un elemento porque en la mayora de los casos el contenido de los nodos ser otro tipo de estructura y es necesario que la comparacin se haga sobre algn campo al que se denomina clave.

BsquedaLa bsqueda consiste acceder a la raz del rbol, si el elemento a localizar coincide con ste la bsqueda ha concluido con xito, si el elemento es menor se busca en el subrbol izquierdo y si es mayor en el derecho. Si se alcanza un nodo hoja y el elemento no ha sido encontrado se supone que no existe en el rbol. Cabe destacar que la bsqueda en este tipo de rboles es muy eficiente, representa una funcin logartmica. El maximo nmero de comparaciones que necesitaramos para saber si un elemento se encuentra en un rbol binario de bsqueda estara entre [log2(N+1)] y N, siendo N el nmero de nodos. La bsqueda de un elemento en un ABB (rbol Binario de Bsqueda) se puede realizar de dos formas, iterativa o recursiva. Ejemplo de versin iterativa en el lenguaje de programacin C, suponiendo que estamos buscando una clave alojada en un nodo donde est el correspondiente "dato" que precisamos encontrar: data Buscar_ABB(abb t,clave k) { abb p; dato e; e=NULL; p=t; if (!estaVacio(p)) { while (!estaVacio(p) && (p->k!=k) ) { if (k < p->k) { p=p->l; } if (p->k < k) { p=p->r; } } if (!estaVacio(p) &&(p->d!=NULL) ) { e=copiaDato(p->d); } } return e; } Vase ahora la versin recursiva en ese mismo lenguaje:

rbol binario de bsqueda 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) return buscar(a->hIzquierdo, elem); else return 1; } Otro ejemplo en Python: def search_binary_tree(node, key): if node is None: return None # not found if key < node.key: return search_binary_tree(node.left, key) else if key > node.key: return search_binary_tree(node.right, key) else: return node.value En Pascal: Function busqueda(T:ABR, y: integer):ABR begin if (T=nil) or (^T.raiz=y) then busqueda:=T; else if (^T.raiz Bool . var R R1 R2 : X$Elt . vars I D : ABB{X} . eq esta?(R, crear) = false . eq esta?(R1, arbolBin(R2, I, D)) = if R1 == R2 then true else if R1 < R2 then esta?(R1, I) else esta?(R1, D)

12

rbol binario de bsqueda fi fi .

13

InsercinLa insercin es similar a la bsqueda y se puede dar una solucin tanto iterativa como recursiva. Si tenemos inicialmente como parmetro un rbol vaco se crea un nuevo nodo como nico contenido el elemento a insertar. Si no lo est, se comprueba si el elemento dado es menor que la raz del rbol inicial con lo que se inserta en el subrbol izquierdo y si es mayor se inserta en el subrbol derecho. De esta forma las inserciones se hacen en las hojas.

Evolucin de la insercin del elemento "5" en un ABB.

Como en el caso de la bsqueda puede haber varias variantes a la hora de implementar la insercin en el TAD (Tipo Abstracto de Datos), y es la decisin a tomar cuando el elemento (o clave del elemento) a insertar ya se encuentra en el rbol, puede que ste sea modificado o que sea ignorada la insercin. Es obvio que esta operacin modifica el ABB perdiendo la versin anterior del mismo. A continuacin se muestran las dos versiones del algoritmo en pseudolenguaje, iterativa y recursiva, respectivamente. PROC InsertarABB(rbol:TABB; dato:TElemento) VARIABLES nuevonodo,pav,pret:TABB clavenueva:Tclave ele:TElemento INICIO nuevonodo hIzquierdo, &aux); free(aux); } } void reemplazar(tArbol **a, tArbol **aux) { if ((*a)->hDerecho == NULL) { (*aux)->clave = (*a)->clave; *aux = *a; *a = (*a)->hIzquierdo; } else reemplazar(&(*a)->hDerecho, aux); } Otro ejemplo en Pascal. 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; else aBorrar:=sucesor(T,x); actual:=T;

rbol binario de bsqueda anterior:=nil; while (actualaBorrar) do begin anterior:=actual; if (^actual.raiz X$Elt . eq min(arbolBin(R, crear, D)) = R . eq max(arbolBin(R, I, crear)) = R . eq min(arbolBin(R, INV, D)) = min(INV) . eq max(arbolBin(R, I, DNV )) = max(DNV) . eq eliminar(M, crear) = crear . ceq eliminar(M, arbolBin(R, crear, D)) = D if M == clave(R) . ceq eliminar(M, arbolBin(R, I, crear)) = I if M == clave(R) . ceq eliminar(M, arbolBin(R, INV, DNV)) = arbolBin(max(INV), eliminar(clave(max(INV)), INV), DNV) if M == clave(R) . ceq eliminar(M, arbolBin(R, I, D)) = arbolBin(R, eliminar(M, I), D) if M < clave(R) . ceq eliminar(M, arbolBin(R, I, D)) = arbolBin(R, I, eliminar(M, D)) if clave(R) < M .

18

rbol binario de bsqueda

19

Otras OperacionesOtra operacin sera por ejemplo comprobar que un rbol binario es un rbol binario de bsqueda. Su implementacin en maude es la siguiente: op esABB? : ABB{X} -> Bool . var R : X$Elt . vars I D : ABB{X} . eq esABB?(crear) = true . eq esABB?(arbolbBin(R, I, D)) = (Max(I) < R) and (Min(D) > R) and (esABB?(I)) and (esABB?(D)) .

RecorridosSe puede hacer un recorrido de un rbol en profundidad o en anchura. Los recorridos en anchura son por niveles, se realiza horizontalmente desde la raz a todos los hijos antes de pasar a la descendencia de alguno de los hijos. El recorrido en profundidad lleva al camino desde la raz hacia el descendiente ms lejano del primer hijo y luego contina con el siguiente hijo. Como recorridos en profundidad tenemos inorden [1], preorden [2] y postorden [3]. Una propiedad de los ABB es que al hacer un recorrido en profundidad inorden obtenemos los elementos ordenados de forma ascendente. 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 .NetEjemplo rbol binario de bsqueda

'funcion de recorrido en PREORDEN Public Function preorden() As String cadenasalida = "" rePreorden(raiz) Return cadenasalida End Function Private Sub rePreorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If cadenasalida = cadenasalida & "-" & padre.dato rePreorden(padre.ant) rePreorden(padre.sig) End Sub 'funcion de recorrido en POSTORDEN Public Function postorden() As String cadenasalida = ""

rbol binario de bsqueda reposorden(raiz) Return cadenasalida End Function Private Sub repostorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If repostorden(padre.ant) repostorden(padre.sig) cadenasalida = cadenasalida & "-" & padre.dato End Sub 'funcion de recorrido en INORDEN Public Function inorden() As String cadenasalida = "" reinorden(raiz) Return cadenasalida End Function Private Sub reinorden(ByVal padre As Nodo) If IsNothing(padre) Then Return End If reinorden(padre.ant) cadenasalida = cadenasalida & "-" & padre.dato reinorden(padre.sig) End Sub

20

Tipos de rboles binarios de bsquedaHay varios tipos de rboles binarios de bsqueda. Los rboles AVL, rbol rojo-negro, son rboles autobalanceables . Los rbol biselado son rboles tambin autobalanceables con la propiedad de que los elementos accedidos recientemente se acceder ms rpido en posteriores accesos. En el montculo como en todos los rboles binarios de bsqueda cada nodo padre tiene un valor mayor q sus hijos y adems es completo, esto es cuando todos los niveles estn llenos con excepcin del ltimo que puede no estarlo. Hay muchos tipos de rboles binarios de bsqueda. Los rboles AVL y los rbol rojo-negro son ambos formas de rboles binarios de bsqueda autobalanceables. Un rbol biselado es un rbol binario de bsqueda que automticamente mueve los elementos a los que se accede frecuentemente cerca de la raz. En los montculos, cada nodo tambin mantiene una prioridad y un nodo padre tiene mayor prioridad que su hijo. Otras dos maneras de configurar un rbol binario de bsqueda podra ser como un rbol completo o degenerado. Un rbol completo es un rbol con "n" niveles, donde cada nivel d HeapNV{X} eq insertarHeap(R, crear) = arbolBin(R, crear, crear) . eq insertarHeap(R1, arbolBin(R2, I, D)) = if ((altura(I) > altura(D)) and not estaLleno?(I)) or (((altura(I) == altura(D)) and estaLleno?(D)) then arbolBin(max(R1, R2),insertarHeap(min(R1, R2), I), D) else arbolBin(max(R1, R2), I,insertarHeap(min(R1, R2), D)) fi . En pseudolenguaje quedara: PROC Flotar ( M, i ) MIENTRAS (i>1) ^ (M.Vector_montculo[i div 2] < M.Vector montculo[i] HACER intercambiar M.Vector montculo[i div 2] ^ M.Vector_montculo[i] i = i div 2 FIN MIENTRAS FIN PROC PROC Insertar ( x, M ) SI M.Tamao_montculo = Tamao_mximo ENTONCES error Montculo lleno SINO M.Tamao_montculo = M.Tamao_montculo + 1 M.Vector_montculo[M.Tamao montculo] = x Flotar ( M, M.Tamao_montculo ) FIN PROC En Java el cdigo sera el siguiente: public void insertItem(Object k, Object e) throws InvalidKeyException { if(!comp.isComparable(k)) throw new InvalidKeyException("Invalid Key"); Position z = T.add(new Item(k, e)); Position u;

26

Montculo (informtica) while(!T.isRoot(z)) { // bubbling-up u = T.parent(z); if(comp.isLessThanOrEqualTo(key(u),key(z))) break; T.swapElements(u, z); z = u; } }

27

EliminarEn este caso eliminaremos el elemento mximo de un montculo. La forma ms eficiente de realizarlo sera buscar el elemento a borrar, colocarlo en la raz e intercambiarlo por el mximo valor de sus hijos satisfaciendo as la propiedad de montculos de mximos. En el ejemplo representado vemos como 19 que es el elemento mximo es el sujeto a eliminar. Se puede observar que ya est colocado en la raiz al ser un montculo de mximos, los pasos a seguir son: 1. Eliminar el elemento mximo (colocado en la raz). 2. Hemos de subir el elemento que se debe eliminar, para cumplir la condicin de montculo a la raz, que ha quedado vaca. 3. Una vez hecho esto queda el ltimo paso el cual es ver si la raz tiene hijos mayores que ella si es as, aplicamos la condicin y sustituimos el padre por el mayor de sus progenitores. A continuacin veremos la especificacin de eliminar en distintos lenguajes de programacin. En Maude el cdigo ser el siguiente: eq eliminarHeap(crear) = crear . eq eliminarHeap(HNV) = hundir(arbolBin(ultimo(HNV), hijoIzq(eliminarUltimo(HNV)), hijoDer(eliminarUltimo(HNV)) ) Donde hundir es una operacin auxiliar que coloca el nodo en su sitio correspondiente. En cdigo Java: public Object removeMin() throws PriorityQueueEmptyException { if(isEmpty()) throw new PriorityQueueEmptyException("Priority Queue Empty!"); Object min = element(T.root()); if(size() == 1) T.remove(); else { T.replaceElement(T.root(), T.remove()); Position r = T.root(); while(T.isInternal(T.leftChild(r))) { Position s; if(T.isExternal(T.rightChild(r)) || comp.isLessThanOrEqualTo(key(T.leftChild(r)),key(T.rightChild(r)))) s = T.leftChild(r); else

Montculo (informtica) s = T.rightChild(r); if(comp.isLessThan(key(s), key(r))) { T.swapElements(r, s); r = s; } else break; } } } Tras haber especificado ambas operaciones y definir lo que es un montculo slo nos queda por aadir que una de las utilizaciones ms usuales del tipo heap (montculo) es en el algoritmo de ordenacin de heapsort. Tambin puede ser utilizado como montculo de prioridades donde la raz es la de mayor prioridad.

28

Vase tambin Montculo binario Montculo binmico Montculo de Fibonacci Montculo suave Montculo 2-3

Referencias[1] http:/ / en. wikipedia. org/ wiki/ Mont%C3%ADculo_%28inform%C3%A1tica%29?action=history

Fuentes y contribuyentes del artculo

29

Fuentes y contribuyentes del artculorbol (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=45171853 Contribuyentes: 4lex, Aeb, Alex485232008, Alexav8, AlfonsoERomero, Antur, AquiLesBailoYo, Ascnder, BlackBeast, CA., Clementito, Damifb, Diegusjaimes, Dodo, Ejrrjs, Farisori, GRHugo, GermanX, Goingvisit, Humberto, Laura Fiorucci, Maleiva, Manuelt15, Matdrodes, Nubecosmica, Periku, Pinar, Poco a poco, Porao, Rmmv, Rosarinagazo, Sabbut, Sanbec, Schwallex, Sms, Ty25, Vcarceler, Wikilptico, Will vm, Yrithinnd, 91 ediciones annimas rbol binario Fuente: http://es.wikipedia.org/w/index.php?oldid=45696592 Contribuyentes: Alfredogtzh, Angus, Ascnder, Aipni-Lovrij, C'est moi, Chewie, Cinabrium, Dagavi, Diegusjaimes, Dodo, Dvdgc, Eduardosalg, Fenrihr, Galandil, Gmarquez, Humbefa, Icvav, Isha, JMPerez, JaNoX, Jaag12, Johnanth, JoseTAD, Laura Fiorucci, Maldoror, Mortadelo2005, Muro de Aguas, Osiris fancy, Periku, PoLuX124, Porao, Pyr0, Rimeju, Rodoelgrande, Rosewitchy, Sabbut, Sanbec, Templeir, Tigrera, Tomatejc, Triku, Victormoz, 162 ediciones annimas rbol binario de bsqueda Fuente: http://es.wikipedia.org/w/index.php?oldid=45663881 Contribuyentes: 3coma14, Albries, Alelapenya, Aluna2007, Andresluna2007, Apj, Chewie, Er Komandante, ErSame, FAR, Humbefa, Joanga, Knzio, Loly bc15, Platonides, Porao, ViajeroEspacial, Yago AB, 42 ediciones annimas Bsqueda en anchura Fuente: http://es.wikipedia.org/w/index.php?oldid=45697679 Contribuyentes: Alberto Salguero, AlfonsoERomero, Almorca, Davidrodriguez, Dodo, Fuelusumar, GermanX, JMPerez, Macarse, Pmontaldo, Regnaron, Rondador, Sabbut, Taichi, 31 ediciones annimas Bsqueda en profundidad Fuente: http://es.wikipedia.org/w/index.php?oldid=44125839 Contribuyentes: Almorca, AngelTC, Caos, Davidrodriguez, Edrabc, Fuelusumar, GermanX, Gswarlus, Mcetina, Pinar, Pmontaldo, Sabbut, Taragui, 21 ediciones annimas Montculo (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=43805956 Contribuyentes: Alexisabarca, Arroy, Ascnder, Bgangioni, Biasoli, Djblack!, Elkim2, Ggenellina, Gsrdzl, Javi007, Jduarte, Jvlivs, Klemen Kocjancic, Luisbona, Nubecosmica, Poco a poco, Porao, Rafael Glvez, Stefano4jc, ZanPATXImbos, 19 ediciones annimas

Fuentes de imagen, Licencias y contribuyentes

30

Fuentes de imagen, Licencias y contribuyentesImagen:Question book.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Question_book.svg Licencia: GNU Free Documentation License Contribuyentes: Diego Grez, Javierme, Loyna, Remember the dot, Victormoz, Wouterhagens, 5 ediciones annimas Archivo:binary_tree_(oriented digraph).png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Binary_tree_(oriented_digraph).png Licencia: Public Domain Contribuyentes: Haui, Helix84, Maximaximax Archivo:binary tree (oriented digraph).png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Binary_tree_(oriented_digraph).png Licencia: Public Domain Contribuyentes: Haui, Helix84, Maximaximax Archivo:Arboles binarios.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Arboles_binarios.jpg Licencia: Public Domain Contribuyentes: Albedo-ukr, Ilmari Karonen, JoseTAD, 1 ediciones annimas Archivo:Lista nodos.JPG Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Lista_nodos.JPG Licencia: Public Domain Contribuyentes: Albedo-ukr, JoseTAD Image:Binary search tree.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Binary_search_tree.svg Licencia: Public Domain Contribuyentes: User:Booyabazooka, User:Dcoetzee Archivo:insertar.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Insertar.svg Licencia: Public Domain Contribuyentes: User:Gorivero Archivo:ABBHOJA3.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:ABBHOJA3.jpg Licencia: Public Domain Contribuyentes: User:Joanga Archivo:ABBHOJA5.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:ABBHOJA5.jpg Licencia: Public Domain Contribuyentes: User:Joanga Archivo:ABBHOJA4.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:ABBHOJA4.jpg Licencia: Public Domain Contribuyentes: User:Joanga Archivo:ABBEJEM.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:ABBEJEM.jpg Licencia: Public Domain Contribuyentes: User:Joanga Archivo:monticulo.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Monticulo.jpg Licencia: Public Domain Contribuyentes: User:Jduarte Archivo:insertarelemmonticulo.jpg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Insertarelemmonticulo.jpg Licencia: Public Domain Contribuyentes: User:Elkim2

Licencia

31

LicenciaCreative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/