Вы находитесь на странице: 1из 32

Contenidos

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

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

Licencias de artculos
Licencia 31

rbol (informtica)

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.

Definicin
Formalmente, 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)

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. Representacin


Las 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 rboles


Usos 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)

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 binario
En 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 grafos


En 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

Implementacin en C
Un 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 binarios


Recorridos en profundidad
El 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 binario
push(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

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

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

Mtodos para almacenar rboles binarios


Los 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

Codificacin de rboles n-arios como rboles binarios


Hay 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

rbol binario de bsqueda


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

Descripcin
Un 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 _<_ : Elt Elt -> 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

Operaciones
Todas 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.

Bsqueda
La 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<y) then busqueda:=busqueda(^T.dch,y); else busqueda:=busqueda(^T.izq,y); end; Una especificacin en maude para la operacin de bsqueda quedara de la siguiente forma: op esta? : X$Elt ABB{X} -> 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

Insercin
La 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 <- NUEVO(TNodoABB) nuevonodo^.izq <- NULO nuevonodo^.der <- NULO nuevonodo^.elem <- dato SI ABBVaco (rbol) ENTONCES rbol <- nuevonodo ENOTROCASO clavenueva <- dato.clave pav <- rbol // Puntero Avanzado pret <- NULO // Puntero Retrasado MIENTRAS (pav <- NULO) HACER pret <- pav ele = pav^.elem SI (clavenueva < ele.clave ) ENTONCES pav <- pav^.izq

rbol binario de bsqueda EN OTRO CASO pav <- pav^.dch FINSI FINMIENTRAS ele = pret^.elem SI (clavenueva < ele.clave ) ENTONCES pret^.izq <- nuevonodo EN OTRO CASO pret^.dch <- nuevonodo FINSI FINSI FIN PROC InsertarABB(rbol:TABB; dato:TElemento) VARIABLES ele:TElemento INICIO SI (ABBVaco(rbol)) ENTONCES rbol <- NUEVO(TNodoABB) rbol^.izq <- NULO rbol^.der <- NULO rbol^.elem <- dato EN OTRO CASO ele = InfoABB(rbol) SI (dato.clave < ele.clave) ENTONCES InsertarABB(rbol^.izq, dato) EN OTRO CASO InsertarABB(rbol^.dch, dato) FINSI FINSI FIN Se ha podido apreciar la simplicidad que ofrece la versin recursiva, este algoritmo es la traduccin en C. El rbol es pasado por referencia para que los nuevos enlaces a los subrboles mantengan la coherencia. void insertar(tArbol **a, int elem) { if (*a == NULL) { *a = (tArbol *) malloc(sizeof(tArbol)); (*a)->clave = elem; (*a)->hIzquierdo = NULL; (*a)->hDerecho = NULL; } else if ((*a)->clave < elem) insertar(&(*a)->hDerecho, elem); else if ((*a)->clave > elem) insertar(&(*a)->hIzquierdo, elem); }

14

rbol binario de bsqueda Ejemplo en Python: def binary_tree_insert(node, key, value): if node is None: return TreeNode(None, key, value, None) if key == node.key: return TreeNode(node.left, key, value, node.right) if key < node.key: return TreeNode(binary_tree_insert(node.left, key, value), node.key, node.value, node.right) else: return TreeNode(node.left, node.key, node.value, binary_tree_insert(node.right, key, value)) Otro ejemplo en Pascal: Procedure Insercion(var T:ABR, y:integer) var ultimo:ABR; actual:ABR; nuevo:ABR; begin ultimo:=nil; actual:=T; while (actual<>nil) do begin ultimo:=actual; if (^actual.raiz<y) then actual:=^actual.dch; else actual:=^actual.izq; end; new(nuevo); ^nuevo.raiz:=y; ^nuevo.izq:=nil; ^nuevo.dch:=nil; if ultimo=nil then T:=nuevo; else if ^ultimo.raiz<y then ^ultimo.dch:=nuovo; else ^ultimo.izq:=nuevo; end; Vase tambin un ejemplo de algoritmo recursivo de insercin en un ABB en el lenguaje de programacin Maude:
op insertar : X$Elt ABB{X} -> ABBNV{X} . var R R1 R2 : X$Elt . vars I D : ABB{X} .

15

rbol binario de bsqueda


eq insertar(R, crear) = arbolBin(R, crear, crear) . eq insertar(R1, arbolBin(R2, I, D)) = if R1 < R2 then arbolBin(R2, insertar(R1, I), D) else arbolBin(R2, I, insertar(R1, D)) fi .

16

La operacin de insercin requiere, en el peor de los casos, un tiempo proporcional a la altura del rbol.

Borrado
La operacin de borrado no es tan sencilla como las de bsqueda e insercin. Existen varios casos a tener en consideracin: Borrar un nodo sin hijos nodo hoja: simplemente se borra y se establece a nulo el apuntador de su padre.

Nodo a eliminar 74

Borrar un nodo con un subrbol hijo: se borra el nodo y se asigna su subrbol hijo como subrbol de su padre.

Nodo a eliminar 70

Borrar un nodo con dos subrboles hijo: la solucin est en reemplazar el valor del nodo por el de su predecesor o por el de su sucesor en inorden y posteriormente borrar este nodo. Su predecesor en inorden ser el nodo ms a la derecha de su subrbol izquierdo (mayor nodo del subarbol izquierdo), y su sucesor el nodo ms a la izquierda de su subrbol derecho (menor nodo del subarbol derecho). En la siguiente figura se muestra cmo existe la posibilidad de realizar cualquiera de ambos reemplazos:

Nodo a eliminar 59

El siguiente algoritmo en C realiza el borrado en un ABB. El procedimiento reemplazar busca la mayor clave del subrbol izquierdo y la asigna al nodo a eliminar. void borrar(tArbol **a, int elem) { void reemplazar(tArbol **a, tArbol **aux); tArbol *aux;

rbol binario de bsqueda

17

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; else if ((*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; } 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 (actual<>aBorrar) do begin anterior:=actual; if (^actual.raiz<^aBorrar.raiz) then actual:=^actual.dch; else actual:=^actual.izq; end; if (^actual.izq=nil) then hijo:=^actual.dch; else hijo:=^actual.izq; if (anterior=nil) then T:=hijo; else if (^anterior.raiz<^actual.raiz) then ^anterior.dch:=hijo; else ^anterior.izq:=hijo; if (aBorrar<>x) then ^x.raiz:=^aBorrar.raiz; free(aBorrar); end; Vase tambin un ejemplo de algoritmo recursivo de borrado en un ABB en el lenguaje de programacin Maude, considerando los generadores crear y arbolBin. Esta especificacin hace uso de la componente clave a partir de la cual se ordena el rbol.
op eliminar : X$Elt ABB{X} -> ABB{X} . varS R M : X$Elt . vars I D : ABB{X} . vars INV DNV : ABBNV{X} . ops max min : ArbolBin{X} -> 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 Operaciones
Otra 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)) .

Recorridos
Se 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 .Net
Ejemplo 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 bsqueda


Hay 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 <= n-1; el nmero de nodos existentes en el nivel "d" es igual que 2d. Esto significa que todos los posibles nodos existen en esos niveles, no hay ningn hueco. Un requirimiento adicional para un rbol binario completo es que para el nivel "n", los nodos deben estar ocupados de izquierda a derecha, no pudiendo haber un hueco a la izquierda de un nodo ocupado. Un rbol degenerativo es un rbol que, para cada nodo padre, slo hay asociado un nodo hijo. Por lo que se comporta como una lista enlazada.

rbol binario de bsqueda

21

Comparacin de rendimiento
D. A. Heger(2004)[4] realiza una comparacin entre los diferentes tipos de rboles binarios de bsqueda para encontrar que tipo nos dara el mejor rendimiento para cada caso. Los montculos se encuentran como el tipo de rbol binario de bsqueda que mejor resultado promedio da, mientras que los rboles rojo-negro los que menor rendimiento medio nos aporta.

Buscando el rbol binario de bsqueda ptimo


Si nosotros no tenemos en mente planificar un rbol binario de bsqueda, y sabemos exactamente como de frecuente sern visitados cada elemento podemos construir un rbol binario de bsqueda ptimo con lo que conseguiremos que la media de gasto generado a la hora de buscar un elemento sea minimizado. Asumiendo que conocemos los elementos y en qu nivel est cada uno, tambin conocemos la proporcin de futuras bsquedas que se harn para encontrar dicho elemento. Si es as, podemos usar una solucin basada en la programacin dinmica. En cambio, a veces slo tenemos la estimacin de los costes de bsqueda, como pasa con los sistemas que nos muestra el tiempo que ha necesitado para realizar una bsqueda. Un ejemplo, si tenemos un ABB de palabras usado en un corrector ortogrfico, deberamos balancear el rbol basado en la frecuencia que tiene una palabra en el Corpus lingstico, desplazando palabras como "de" cerca de la raz y palabras como "vesnico" cerca de las hojas. Un rbol como tal podra ser comparado con los rboles Huffman que tratan de encontrar elementos que son accedidos frecuentemente cerca de la raz para producir una densa informacin; de todas maneras, los rboles Huffman slo puede guardar elementos que contienen datos en las hojas y estos elementos no necesitan ser ordenados. En cambio, si no sabemos la secuencia en la que los elementos del rbol van a ser accedidos, podemos usar rboles biselados que son tan buenos como cualquier rbol de bsqueda que podemos construir para cualquier secuencia en particular de operaciones de bsqueda. rboles alfabticos son rboles Huffman con una restriccin de orden adicional, o lo que es lo mismo, rboles de bsqueda con modificacin tal que todos los elementos son almacenados en las hojas.

Vase tambin
rbol (programacin) rbol Binario rbol AVL rbol 2-3 rbol B rbol Rojo-Negro rbol Splay rbol Multirrama

rbol binario de bsqueda

22

Referencias
[1] [2] [3] [4] http:/ / es. wikipedia. org/ wiki/ %C3%81rbol_binario#Recorrido_en_inorden http:/ / es. wikipedia. org/ wiki/ %C3%81rbol_binario#Recorrido_en_preorden http:/ / es. wikipedia. org/ wiki/ %C3%81rbol_binario#Recorrido_en_postorden Heger, Dominique A. (2004), A Disquisition on The Performance Behavior of Binary Search Tree Data Structures (http:/ / www. upgrade-cepis. org/ issues/ 2004/ 5/ up5-5Mosaic. pdf), European Journal for the Informatics Professional 5 (5),

Enlaces externos
rboles binarios de bsqueda en google Implementacin de rboles binarios de bsqueda en distintos lenguajes (http://en.literateprograms.org/ Categora:Binary_search_tree) Aplicacin JAVA de rboles (http://people.ksp.sk/~kuko/bak/index.html)

Bsqueda en anchura
En Ciencias de la Computacin, Bsqueda en anchura (en ingls BFS - Breadth First Search) es un algoritmo para recorrer o buscar elementos en un grafo (usado frecuentemente sobre rboles). Intuitivamente, se comienza en la raz (eligiendo algn nodo como elemento raz en el caso de un grafo) y se exploran todos los vecinos de este nodo. A continuacin para cada uno de los vecinos se exploran sus respectivos vecinos adyacentes, y as hasta que se recorra todo el rbol. Formalmente, BFS es un algoritmo de bsqueda sin informacin, que expande y examina todos los nodos de un rbol sistemticamente para buscar una solucin. El algoritmo no usa ninguna estrategia heurstica. Si las aristas tienen pesos negativos aplicaremos el algoritmo de Bellman-Ford en alguna de sus dos versiones.

Procedimiento
Dado un vrtice fuente s, Breadth-first search sistemticamente explora los vrtices de G para descubrir todos los vrtices alcanzables desde s. Calcula la distancia (menor nmero de vrtices) desde s a todos los vrtices alcanzables. Despus produce un rbol BF con raz en s y que contiene a todos los vrtices alcanzables. El camino desde s a cada vrtice en este recorrido contiene el mnimo nmero de vrtices. Es el camino ms corto medido en nmero de vrtices. Su nombre se debe a que expande uniformemente la frontera entre lo descubierto y lo no descubierto. Llega a los nodos de distancia k, slo tras haber llegado a todos los nodos a distancia k-1.

Pseudocdigo
La nomenclatura adicional utilizada es: Q = Estructura de datos cola
BFS(grafo G, nodo_fuente s) { // recorremos todos los vrtices del grafo inicializndolos a NO_VISITADO, // distancia INFINITA y padre de cada nodo NULL for u V[G] do { estado[u] = NO_VISITADO; distancia[u] = INFINITO; /* distancia infinita si el nodo no es alcanzable */

Bsqueda en anchura
padre[u] = NULL; } estado[s] = VISITADO; distancia[s] = 0; Encolar(Q, s); while !vacia(Q) do { // extraemos el nodo u de la cola Q y exploramos todos sus nodos adyacentes u = extraer(Q); for { if estado[v] == NO_VISITADO then { estado[v] = VISITADO; distancia[v] = distancia[u] + 1; padre[v] = u; Encolar(Q, v); } } } } *Falta recorrer vertices no adyacentes directa o indirectamente al vertice origen "s", pues cola queda vacia sin los adyacentes restantes. v adyacencia[u] do

23

El tiempo de ejecucin es O(|V|+|E|). Ntese que cada nodo es puesto a la cola una vez y su lista de adyacencia es recorrida una vez tambin.

Referencias
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 22.3: Depth-first search, pp.531 - 539.

Bsqueda en profundidad

24

Bsqueda en profundidad
Una Bsqueda en profundidad (en ingls DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un grafo o rbol (teora de grafos) de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan ms nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado. Anlogamente existe el algoritmo de bsqueda en anchura (BFS o Breadth First Search).

Pseudocdigo
Pseudocdigo para grafos DFS(grafo G) PARA CADA vertice u V[G] HACER estado[u] NO_VISITADO padre[u] NULO tiempo 0 PARA CADA vertice u V[G] HACER SI estado[u] = NO_VISITADO ENTONCES DFS_Visitar(u) DFS-Visitar(nodo u) estado[u] VISITADO tiempo tiempo + 1 d[u] tiempo PARA CADA v Vecinos[u] HACER SI estado[v] = NO_VISITADO ENTONCES padre[v] u DFS_Visitar(v) estado[u] TERMINADO tiempo tiempo + 1 f[u] tiempo

Arcos DF
Si en tiempo de descubrimiento de u tenemos el arco (u,v): i. Si el estado de v es NO_VISITADO, entonces (u,v) DF,

Vase tambin
rbol (estructura de datos) Lema: Un grafo dirigido es cclico si y slo si al ejecutar DFS(G) produce al menos un arco hacia atrs.

Referencias
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 22.3: Depth-first search, pp.540549.

Montculo (informtica)

25

Montculo (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|Montculo (informtica)}} ~~~~

En computacin, un montculo (heap en ingls) es una estructura de datos del tipo rbol con informacin perteneciente a un conjunto ordenado. Los montculos mximos tienen la caracterstica de que cada nodo padre tiene un valor mayor que el de todos sus nodos hijos, mientras que en los montculos mnimos, el valor del nodo padre es siempre menor al de sus nodos hijos. Un rbol cumple la condicin de montculo si satisface dicha condicin y adems es un rbol binario completo. Un rbol binario es completo cuando todos los niveles estn llenos, con la excepcin del ltimo, que se llena desde la izquierda hacia la derecha.

Ejemplo de montculo.

En un montculo de prioridad, el mayor elemento (o el menor, dependiendo de la relacin de orden escogida) est siempre en el nodo raz. Por esta razn, los montculos son tiles para implementar colas de prioridad. Una ventaja que poseen los montculos es que, por ser rboles completos, se pueden implementar usando arreglos, lo cual simplifica su codificacin y libera al programador del uso de punteros. La eficiencia de las operaciones en los montculos es crucial en diversos algoritmos de recorrido de grafos y de ordenamiento (heapsort).

Operaciones
Las operaciones ms importantes o bsicas en un montculo son la de insercin y la de eliminacin de uno o varios elementos.

Insertar
Monticulus: Esta operacin parte de un elemento y lo inserta en un montculo aplicando su criterio de ordenacin.Si suponemos que el monticulo est estructurado de forma que la raz es mayor que sus hijos, comparamos el elemento a insertar (incluido en la primera posicin libre) con su padre.Si el hijo es menor que el padre,entonces el elemento es insertado correctamente, si ocurre lo contrario sustituimos el hijo por el padre.

Cmo se inserta un elemento en un montculo.

Y si la nueva raz sigue siendo ms grande que su nuevo padre?. Volvemos a hacer otra vez dicho paso hasta que el montculo quede totalmente ordenado. En la imagen adjunta vemos el ejemplo de cmo realmente se inserta un elemento en un montculo. Aplicamos la condicin de que cada padre sea mayor que sus hijos, y siguiendo dicha regla el elemento a insertar es el 12. Es mayor que su padre, siguiendo el mtodo de ordenacin, sustituimos el elemento por su padre que es 9 y as quedara el montculo ordenado. Ahora veremos la implementacin en varios lenguajes de programacin del algoritmo de insercin de un elemento en un montculo. En Maude el insertar se realiza a travs de un constructor:

Montculo (informtica) op insertarHeap : X$Elt Heap{X} -> 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

Eliminar
En 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 artculo


rbol (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 contribuyentes


Imagen: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

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

Вам также может понравиться