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

UNIVERSIDAD DE CARABOBO FACULTAD EXPERIMENTAL DE CIENCIAS Y TECNOLOGA DEPARTAMENTO DE COMPUTACIN CS218 ALGORITMOS Y PROGRAMACIN II

TEMA 7 ESTRUCTURAS JERRQUICAS: RBOLES

Mayo, 2005

1.- Arboles Narios: Definiciones y Conceptos Bsicos Algunas veces, cuando se modela una situacin, se determina que la mejor manera de representar la relacin que existe entre los objetos involucrados es mediante una estructura jerrquica. Algunos ejemplos tpicos de esta situacin son los siguientes: Organigrama: Describe la organizacin administrativa (estructura) de una empresa a travs de la relacin entre las diferentes unidades de trabajo. Indice de un libro: Enumeracin ordenada del contenido de un libro. Arboles genealgicos: Representacin grfica de las ancestros y descendientes de una persona.

Definicin: (Arbol Nario no ordenado con tipo base T) Formalmente, un rbol Nario no ordenado con tipo base T se puede definir de manera recursiva como sigue: 1. La secuencia vaca representa al rbol nulo no ordenado. Se denota por . 2. Sea e un elemento de tipo T y A1, A2, , AN rboles Narios no ordenados con tipo base T. Entonces la secuencia A = e, [A1, A2, , AN], donde [A1, A2, , AN] denota un multiconjunto de rboles N-arios, es un rbol Nario no ordenado con tipo base T y se definen las siguientes relaciones: e es la raz de A. i ( 1 i N ) ( Ai es un subrbol de A ) i ( 1 i N ) ( e es padre de la raz de Ai )

i ( 1 i N ) ( la raz de Ai es hijo de e )

3. Slo son rboles Narios no ordenados con tipo base T los objetos generados por la aplicacin de las clusulas (1) y (2). Grado de un nodo: Es el nmero de hijos (subrboles) de ese nodo. Grado de un rbol: Es el grado del nodo de mayor grado en el rbol. Hoja o nodo terminal: Es un nodo de grado 0. Nodo no terminal o interior: Es todo nodo de un rbol que no es una hoja. Nodos hermanos: Dos nodos e1 y e2 de un rbol son hermanos si y slo si tienen el mismo padre. Camino entre dos nodos: Un camino entre dos nodos e y e' de un rbol es una secuencia de nodos e1, e2, , en tal que verifica las siguientes propiedades: e1 = e en = e' i ( 1 i < n ) ( ei es padre de ei+1 ) Longitud de un camino: La longitud de un camino C = e1, e2, , en se define como el nmero de veces que se debe aplicar la relacin padre hijo durante el recorrido, es decir, es el nmero de nodos en el camino menos 1. Rama: Es un camino que parte de la raz y termina en una hoja. Nivel de un nodo: Es la longitud del camino que parte de la raz y llega a ese nodo.

Altura de un nodo: Es la longitud del camino ms largo desde el nodo hasta una hoja. Altura de un rbol: Es la altura de la raz del rbol. La altura de un rbol nulo se define como 1. Peso de un rbol: Es el nmero de nodos que contiene el rbol. El peso de un rbol nulo es 0. 2.- Class ArbolN Para el desarrollo de la Class ArbolN, se supone que los elementos almacenados en los nodos o vrtices son de un tipo genrico que llamaremos Elemento. Class ArbolN<Elemento> ESPECIFICACIN O PERACIONAL Sintaxis Class ArbolN <Elemento> nuloArbolN : es_nuloArbolN : crearArbolN : razArbolN : Hijos : ins_subrbol : Elim._subrbol : Semntica Por convencin se denota como A el rbol A despus de aplicar la operacin. { Pre: } { Post: A } { Pre: } { Post: es_nuloArbolN (A = ) } { Pre: } { Post: si lst = A1, A2, AN entonces A e, A1, A2, AN } { Pre: es_nuloArbolN(A) } func razArbolN (A : ArbolN) : Elemento; proc crearArbolN (var A: ArbolN; e : Elemento; lst : Lista[ ArbolN ]) func es_nuloArbolN (A : ArbolN) : Booleano; proc nuloArbolN (var A: ArbolN ) ArbolN Elemento Lista[ ArbolN ] ArbolN ArbolN ArbolN ArbolN ArbolN Natural ArbolN Booleano ArbolN Elemento Lista[ ArbolN ] ArbolN ArbolN

{ Post: si A = e, A1, A2, AN entonces razArbolN e }

{ Pre: es_nuloArbolN(A) } func hijos (A : ArbolN) : Lista[ ArbolN ];

{ Post: si A = e, A1, A2, AN entonces hijos A1, A2, AN donde i (1 i n)(Ai es el isimo subrbol de A }

{ Post: si A = e, A1, A2, AN entonces A e, A1, A2, AN, B } { Pre: es_nuloArbolN(A) (1 pos longitud(hijos(A))) } proc elim_subrbol (var A: ArbolN; pos: entero)

{ Pre: es_nuloArbolN(A) es_nuloArbolN(B) } proc ins_subrbol (var A: ArbolN; B : ArbolN)

{ Post: si A = e, A1, A2, , Apos1, Apos, Apos+1, , AN entonces A e, A1, A2, , Apos1, Apos+1, , AN } 2.2.- IMPLEMENTACIN En esta seccin se presentan algunas de las representaciones ms utilizadas para implementar rboles Narios, con sus respectivos algoritmos. En cada una de las representaciones se supone que se cumplen todas las precondiciones planteadas en la especificacin pre / post de cada operacin.

2.2.1.- Representacin hijoizquierdo hermanoderecho En esta implementacin, el rbol est representado por un apuntador a su nodo raz y cada nodo tiene un apuntador a su primer hijo (hijo ms a la izquierda) y a su hermano derecho. class nodo begin private: elem : elemento; hijo_izq : pointer to nodo; hno_der : pointer to nodo; public: nodo(); ~nodo(); func get_elem() : elemento; func get_hijo_izq() : pointer to nodo; func get_hno_der() : pointer to nodo; proc set_elem(in e : elemento); proc set_hijo_izq(in p : pointer to nodo); proc set_hno_der(in p : pointer to nodo);

end

class ArbolN begin private: arbn : pointer to nodo; public: ArbolN(); ~ArbolN(); func es_nulo() : logical; func raz () : elemento; func hijos() : lista<ArbolN>; proc proc proc proc crear(in e: elemento; in lst: lista<ArbolN>); ins_subrbol(in a : ArbolN); elim_subrbol (in pos : integer); destruir_rbol();

end

2.2.2.- Representacin con vector de apuntadores const MAX_HIJOS = ?; (Constante predefinida)

class nodo begin private: elem : elemento; sub_arboles : array [1 .. MAX_HIJOS] of pointer to nodo; public: nodo(); ~nodo(); func get_elem() : elemento; func get_sub_arbol(in pos) : pointer to nodo; proc set_elem(in e : elemento); proc set_sub_arbol(in p : pointer to nodo);

end

class ArbolN begin private: arbn : pointer to nodo; public: ArbolN(); ~ArbolN(); func es_nulo() : logical; func raz () : elemento; func hijos() : lista<ArbolN>; proc proc proc proc crear(in e: elemento; in lst: lista<ArbolN>); ins_subrbol(in a : ArbolN); elim_subrbol (in pos : integer); destruir_rbol();

end

3.- Recorrido de rboles n-arios Entendemos por recorrer un rbol visitar (y procesar) cada uno de los nodos que lo componen, una sola vez y en un determinado orden. Existen 4 mtodos bsicos, los cuales difieren en el orden en que procesamos los nodos:

Recorrido en preorden: i. ii. Visitar la raz (y procesarla)). Recorrer cada uno de los hijos en preorden

Recorrido en inorden: i. ii. iii. Recorrer el primer hijo en inorden. Visitar la raz (y procesarla) Recorrer el resto de los hijos en inorden

Recorrido en postorden: i. ii. Recorrer cada uno de los hijos en postorden Visitar la raz (y procesarla)

Recorrido por niveles: para i 1 hasta num_niveles_arbol hacer recorrer nodos del nivel i partiendo del nodo ms a la izquierda fpara

4.- Arboles binarios: Definiciones y Conceptos Bsicos Arbol completo: Un rbol binario es completo si y slo si todo nodo no terminal tiene exactamente dos subrboles no vacos. Arbol lleno: Un rbol binario est lleno si y slo si es completo y, adems, todas las hojas estn en el mismo nivel. Arbol casi lleno: Un rbol binario est casi lleno si y slo si est lleno hasta el penltimo nivel y todas las hojas del ltimo nivel estn tan a la izquierda como es posible. Arboles iguales: Dos rboles binarios son iguales si y slo si ambos son nulos, o si sus races son iguales, lo mismo que sus respectivos subrboles izquierdo y derecho. Arboles isomorfos: Dos rboles binarios son isomorfos si y slo si tienen la misma estructura pero no necesariamente los mismos elementos. Arboles semejantes: Dos rboles binarios son semejantes si y slo si contienen los mismos elementos, aunque no sean isomorfos. Ocurrencia de un rbol binario en otro: Un rbol binario A1 ocurre en otro rbol binario A2 si y slo si A1 y A2 son iguales o si A1 es igual a alguno de los subrboles de A2.

5.- Class ArBin ESPECIFICACIN O PERACIONAL Sintaxis Class ArBin [ Elemento ] nuloArBin : es_nuloArBin : crearArBin : razArBin : hijo_der : hijo_izq : Semntica Por convencin se denota como A el rbol A despus de aplicar la operacin. proc nuloArBin(var A: ArBin) { Post: A } { Pre: } { Pre: } ArBin Booleano ArBin Elemento ArBin ArBin

ArBin Elemento ArBin ArBin ArBin ArBin ArBin

func es_nuloArBin(A : ArBin) : Booleano; { Post: es_nuloArBin (A = ) } { Pre: }

proc crearArBin(var A: ArBin; e : Elemento; A1, A2 : ArBin) { Post: A e, A1, A2 }

{ Pre: es_nuloArBin(A) } func razArBin(A: ArBin): Elemento; { Post: si A = e, A1, A2 entonces razArBin e } { Pre: es_nuloArBin(A) } func hijo_der(A: ArBin): ArBin; { Post: si A = e, A1, A2 entonces hijo_der A2 } { Pre: es_nuloArBin(A) } func hijo_izq(A: ArBin): ArBin; { Post: si A = e, A1, A2 entonces hijo_izq A1 }

5.2.- IMPLEMENTACIN En esta seccin se presentan algunas de las representaciones ms utilizadas para implementar rboles binarios, con sus respectivos algoritmos. En cada una de las representaciones se supone que se cumplen todas las precondiciones planteadas en la especificacin pre / post de cada operacin. 5.2.1.- rboles sencillamente enlazados (Hijo Izquierdo Hijo Derecho) Definicin de la estructura de datos que representa a los objetos de la clase. class nodo begin private: elem : elemento; hijo_izq :pointer to nodo; hijo_der :pointer to nodo; public: nodo(); ~nodo(); func get_elem() : elemento; func get_hijo_izq() : pointer to nodo; func get_hijo_der() : pointer to nodo; proc set_elem(in e : elemento); proc set_hijo_izq(in p : pointer to nodo); proc set_hijo_der(in p : pointer to nodo);

end

class ArBin begin private: arb : pointer to nodo; public: func es_nulo() : logical; func raz () : elemento; func get_hijo_izq() : ArBin; func get_hijo_der() : ArBin; end proc crear(in e: elemento; in A1, A2 : ArBin);

6.- Recorrido de rboles binarios Los esquemas de recorrido para el caso de rboles binarios son los siguientes:

Recorrido en preorden: i. ii. iii. Visitar la raz (y procesarla) Recorrer el subarbol izq en preorden Recorrer el subarbol der en preorden

Recorrido en inorden: i. ii. iii. Recorrer el subarbol izq en inorden. Visitar la raz (y procesarla) Recorrer el subarbol der en inorden

Recorrido en postorden: i. ii. iii. Recorrer el subarbol izq en postorden. Recorrer el subarbol der en postorden Visitar la raz (y procesarla)

Recorrido por niveles: para i 1 hasta num_niveles_arbol hacer recorrer nodos del nivel i partiendo del nodo ms a la izquierda

fpara

7.- Reconstruccin de un rbol binario a partir de sus recorridos Si un rbol binario no tiene elementos repetidos, es posible reconstruirlo a partir de las secuencias de vrtices producidas por dos de sus recorridos (preorden e inorden o postorden e inorden). El proceso de reconstruccin se muestra en el siguiente ejemplo: Suponga que se quiere reconstruir el rbol binario sin elementos repetidos cuyos recorridos en preorden e inorden vienen dados por las siguientes secuencias: preorden: inorden: h f a b b g f a g c c h m n n m d d

Paso 1: Encontrar la raz, que siempre es el primer elemento del recorrido en preorden, y localizarla en el recorrido en inorden. De esta manera, el recorrido en inorden queda dividido en los recorridos en inorden que corresponden a las secuencias en inorden de los dos subrboles del rbol original.

preorden:

c h

inorden:

Paso 2: Conociendo el nmero de nodos de cada uno de los subrboles, que se determina por la longitud de las dos subsecuencias obtenidas en el paso anterior, puede extraerse del recorrido en preorden del rbol originar, los recorridos en preorden de los subrboles.

preorden:

c h

inorden:

Paso 3: Repetir los pasos 1 y 2 con cada uno de los subrboles encontrados.

preorden:

c h

inorden: inorden: f 8.- rboles de Sintaxis: b g

a c n

m d

Una aplicacin bastante comn de los rboles binarios es la representacin de expresiones matemticas. Un rbol de sintaxis es un rbol binario que permita representar expresiones aritmticas Expresiones Aritmticas: Toda expresin aritmtica est constituida por operadores y operandos, y representa la manera de obtener un resultado a partir del valor de sus componentes. Cada operador representa una operacin aritmtica, y tiene asociados dos operandos, los cuales son los valores a los que se les aplicar la operacin para obtener un resultado. Este resultado puede ser a su vez, uno de los operandos de otra operacin. Los operadores binarios que consideraremos en este tema son los siguientes: suma (+), resta (-), multiplicacin (*) y divisin ( / ). Los operandos sern constantes o variables. Las constantes son secuencias de dgitos y las variables son secuencias de letras. Una expresin aritmtica en notacin infija puede estar formada por una variable, una constante o dos expresiones aritmticas infijas, cada una de ellas entre parntesis, con un operador binario entre ellas. Ntese la naturaleza recursiva de esta descripcin. En las expresiones infijas los parntesis son indispensables para evitar ambigedades en cuanto a la precedencia de los operadores. Una expresin aritmtica en notacin infija se define recursivamente de la siguiente manera: Si E es una constante numrica, entonces E es una expresin aritmtica en notacin infija. Si E es una variable numrica, entonces E es una expresin aritmtica en notacin infija. Si E1 y E2 son expresiones aritmticas en notacin infija y op {+, -, *, /}, entonces (E1 op E2) es una expresin aritmtica en notacin infija.

C D 5 G

(C * D) ((C * D) / (5 + G)) (5 + G)

Un rbol de sintaxis es un rbol binario completo, en el cual los nodos interiores son operadores y las hojas son operandos. Un rbol de sintaxis representa sin ambigedad, una expresin aritmtica. Por ejemplo, si se tiene la expresin ((A + 10) * 15) (B / 10), sta puede ser representada, sin necesidad de los parntesis,

con un rbol como el que se muestra a continuacin, en el cual la relacin padre relacin operador operando, la cual es recursiva.

hijo, viene dada por la

* + A 10 15 B / 10

A partir del rbol de sintaxis asociado a una expresin aritmtica, pueden obtenerse las representaciones en notacin prefija, postfija e infija de la misma, mediante los recorridos en preorden, postorden e inorden del rbol, respectivamente.

9.- rboles Binarios de Bsqueda Una de las aplicaciones ms frecuentes de los rboles binarios es el almacenamiento de conjuntos de datos entre los cuales puede establecerse una relacin de orden. El almacenar datos de manera ordenada permite mejorar la eficiencia de las operaciones de acceso a la informacin. Si en un rbol binario los elementos estn organizados de tal manera que aquellos menores que la raz se encuentran en el subrbol izquierdo y los elementos mayores que la raz estn en el subrbol derecho, y esta propiedad se mantiene recursivamente en cada subrbol, se tiene una estructura llamada rbol binario de bsqueda o rbol binario ordenado. De una manera ms formal, se dice que un rbol binario es de bsqueda si todos los elementos del subrbol izquierdo son menores que la raz, la raz es menor que todos los elementos del subrbol derecho y los dos subrboles asociados son tambin rboles binarios de bsqueda. Por definicin, el rbol vaco es un rbol binario de bsqueda. En un rbol con estas caractersticas, la bsqueda de un elemento parte de la raz y prosigue, en cada nodo, por el subrbol izquierdo o el subrbol derecho, de acuerdo al resultado de la inspeccin del valor almacenado en el nodo.

10.- rboles Binarios Balanceados Un problema de los rboles binarios de bsqueda es que no es suficiente con mantenerlos ordenados para garantizar la rapidez en el acceso a la informacin, ya que la complejidad del peor caso en la operacin de acceso a la informacin es O(n), a pesar de que la complejidad del caso promedio es O(log2n). Una solucin posible consiste en exigir que los dos subrboles asociados tengan, aproximadamente, el mismo nmero de componentes, garantizando de esta manera que, en cada paso de una bsqueda, se descarten aproximadamente la mitad de los elementos que an no han sido inspeccionados. Los rboles binarios con esta caracterstica se denominan balanceados y garantizan que la operacin de bsqueda de un elemento tiene una complejidad O(log2n) en el peor caso. Bsicamente un rbol binario balanceado es un rbol binario de bsqueda con una condicin de equilibrio. Esta caracterstica tiene, sin embargo, un costo. Los algoritmos de insercin y eliminacin sobre rboles balanceados, son ms complicados, ya que deben considerar la modificacin de la estructura del rbol, de tal manera de garantizar la condicin de balance despus de cada insercin o eliminacin. Existen dos tipos de rboles binarios balanceados: rboles perfectamente balanceados (o balanceados por peso) rboles AVL (o balanceados por altura) rboles Perfectamente Balanceados Sea A = e, A1, A2 un rbol binario de bsqueda. Se dice que A es un rbol perfectamente balanceado si y slo si satisface las siguientes condiciones: | peso(A1) peso(A2) | 1 (Condicin de Equilibrio) A1 y A2 son rboles perfectamente balanceados El rbol vaco es, por definicin, un rbol perfectamente balanceado. rboles AVL Adelson Velskii y Landis introdujeron el 1962 el concepto de rbol balanceado por altura (o rbol AVL por las iniciales de los autores). En este tipo de rboles, las alturas de los dos subrboles asociados a cada elemento no pueden diferir en ms de 1, y los dos subrboles deben ser tambin AVL. Por definicin, el rbol vaco es un rbol AVL. Una definicin ms formal es la siguiente: Sea A = e, A1, A2 un rbol binario de bsqueda. Se dice que A es un rbol AVL si y slo si satisface las siguientes condiciones: | altura(A1) altura(A2) | 1 (Condicin de Equilibrio) A1 y A2 son rboles AVL

Cada vez que se realiza una insercin o una eliminacin en un rbol AVL, se debe comprobar que se preserva la condicin de equilibrio en cada nodo del rbol AVL. Si la condicin de equilibrio no se preserva en alguno de los nodos entonces se debe restablecer el equilibrio del rbol utilizando el proceso de rotacin. Existen dos tipos principales de rotacin:

Rotacin Simple Rotacin Doble

A continuacin veremos una descripcin detallada del proceso de rotacin enmarcada en el proceso de insercin y eliminacin de elementos de un rbol AVL. Insercin en un AVL La insercin en un AVL se realiza de la misma forma que en un rbol binario de bsqueda, sin embargo, una vez hecha la insercin, se debe comprobar que se preserva la condicin de equilibrio en cada nodo del rbol AVL. El problema potencial que se puede producir despus de una insercin es que el rbol con el nuevo nodo no sea AVL:

En el ejemplo de la figura, la condicin de balance se pierde al insertar el nmero 3 en el rbol, por lo que es necesario restaurar de alguna forma dicha condicin. Esto siempre es posible de hacer a travs de una modificacin simple en el rbol, conocida como rotacin. Suponga que despus de la insercin de un elemento X el nodo desbalanceado ms profundo en el rbol es N. Esto quiere decir que la diferencia de altura entre los dos hijos de N tiene que ser 2, puesto que antes de la insercin el rbol estaba balanceado. La violacin del balance pudo ser ocasionada por alguno de los siguientes casos: El El El El elemento X fue insertado en el subrbol elemento X fue insertado en el subrbol elemento X fue insertado en el subrbol elemento X fue insertado en el subrbol izquierdo del hijo izquierdo de N. derecho del hijo izquierdo de N. izquierdo del hijo derecho de N. derecho del hijo derecho de N.

Dado que el primer y ltimo caso son simtricos, as como el segundo y el tercero, slo hay que preocuparse de dos casos principales: una insercin "hacia afuera" con respecto a N (primer y ltimo caso) o una insercin "hacia adentro" con respecto a N (segundo y tercer caso).

Rotacin simple
El desbalance por insercin "hacia afuera" con respecto a N se soluciona con una rotacin simple.

La figura muestra la situacin antes y despus de la rotacin simple, y ejemplifica el cuarto caso anteriormente descrito, es decir, el elemento X fue insertado en E, y b corresponde al nodo N. Antes de la insercin, la altura de N es la altura de C+1. Idealmente, para recuperar la condicin de balance se necesitara bajar A en un nivel y subir E en un nivel, lo cual se logra cambiando las referencias derecha de b e izquierda de d, quedando este ltimo como nueva raz del rbol, N'. Ntese que ahora el nuevo rbol tiene la misma altura que antes de insertar el elemento, C+1, lo cual implica que no puede haber nodos desbalanceados ms arriba en el rbol, por lo que es necesaria una sola rotacin simple para devolver la condicin de balance al rbol. Ntese tambin que el rbol sigue cumpliendo con la propiedad de ser ABB.

Rotacin doble
Claramente un desbalance producido por una insercin "hacia adentro" con respecto a N no es solucionado con una rotacin simple, dado que ahora es C quien produce el desbalance y, como se vio anteriormente, este subrbol mantiene su posicin relativa con una rotacin simple.

Para el caso de la figura (tercer caso), la altura de N antes de la insercin era G+1. Para recuperar el balance del rbol es necesario subir C y E y bajar A, lo cual se logra realizando dos rotaciones simples: la primera entre d y f, y la segunda entre d, ya rotado, y b, obtenindose el resultado de la figura. A este proceso de dos rotaciones simples se le conoce como rotacin doble, y como la altura del nuevo rbol N' es la misma que antes de la insercin del elemento, ningn elemento hacia arriba del rbol queda desbalanceado, por lo que slo es necesaria una rotacin doble para recuperar el balance del rbol despus de la insercin. Ntese que el nuevo rbol cumple con la propiedad de ser rbol binario de bsqueda despus de la rotacin doble. A continuacin se presenta un esquema ms detallado de cada una de las rotaciones mencionadas hasta ahora, as como los algoritmos para implementarlas.

Rotaciones Simples Rotacin Izquierda Estado Inicial Estado Intermedio Estado Final

proc rotacin_izq(var A: ArBin) var temp: ArBin; comienzo temp hijo_der(A); A crearArBin(raz(A), hijo_izq(A), hijo_izq(temp)); rotacin_izq crearArBin(raz(temp), A, hijo_der(temp)) fin; Rotacin Derecha Estado Inicial Estado Intermedio Estado Final

proc rotacin_der(var A: ArBin) var temp: ArBin; comienzo temp hijo_izq(A); A crearArBin(raz(A), hijo_der(temp), hijo_der(A)); rotacin_der crearArBin(raz(temp), hijo_izq(temp), A) fin;

Rotaciones Dobles Rotacin Derecha Izquierda Estado Inicial Estado Intermedio Estado Final

Estado Inicial

Estado Intermedio

Estado Final

Proc rotacin_DI(var A: ArBin) var temp: ArBin; comienzo temp rotacin_der(hijo_der(A)); rotacin_DI rotacin_izq(crearArBin(raz(A), hijo_izq(A), temp) fin; Rotacin Izquierda Derecha Estado Inicial Estado Intermedio Estado Final

Estado Inicial

Estado Intermedio

Estado Final

proc rotacin_ID(NS A: ArBin) var temp: ArBin; comienzo temp rotacin_izq(hijo_izq(A)); rotacin_ID rotacin_der(crearArBin(raz(A), temp, hijo_der(A)) fin; Eliminacin en un AVL

La eliminacin en rbol AVL se realiza de manera anloga a un rbol binario de bsqueda, pero tambin es necesario verificar que la condicin de balance se mantenga una vez eliminado el elemento. En caso que dicha condicin se pierda, ser necesario realizar una rotacin simple o doble dependiendo del caso, pero es posible que se requiera ms de una rotacin para reestablecer el balance del rbol. Construccin de un rbol AVL Construir un rbol AVL a partir de la siguiente secuencia de elementos. 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8 Realice el proceso de construccin paso a paso. Los elementos 1 y 2 se insertan sin inconvenientes. Al

insertar el 3 se viola la condicin de equilibrio en el nodo raz:

1 2 3

Se realiza una rotacin simple para solucionar el problema:

2 1 3

El elemento 4 se agrega sin problemas. Pero, la insercin del 5 produce una violacin de la condicin de equilibrio en el nodo 3:

2 1 3 4 5

Se realiza una rotacin simple para solucionar el problema:

2 1 3 4 5

La insercin del 6 genera un problema de equilibrio en el nodo raz:

2 1 3 4 5 6

Se realiza una rotacin simple para solucionar el problema:

4 2 1 3 5 6

Al insertar el 7, se produce un problema de equilibrio en el nodo 5:

4 2 1 3 5 6 7
El problema se resuelve por medio de una rotacin simple:

4 2 1 3 5 6 7

La insercin del 15 no destruye la propiedad de equilibrio. Pero, al insertar el 14 se produce un desequilibrio en el nodo 7:

4 2 1 3 5 6 7
15 14

Para solucionar este inconveniente, se realiza una rotacin doble derechaizquierda:

4 2 1 3 5 7 6
14 15

Al insertar el elemento 13, se produce un desequilibrio en el nodo 6:

4 2 1 3 5 7
13

6
14 15

Para solucionar este inconveniente, se realiza una rotacin doble derechaizquierda:

4 2 1 3 5 6
13

7
14 15

Al insertar el 12, se viola la condicin de equilibrio en el nodo raz:

4 2 1 3 5
12

7 6
13 14 15

Se realiza una rotacin simple para solucionar el problema:

7 4 2 1 3 5 6
12 13 14 15

La insercin de 11 produce un desequilibrio en el nodo 13:

7 4 2 1 3 5
11 14

6
12

13

15

Se requiere una rotacin simple para solucionar este inconveniente:

7 4 2 1 3 5 6
11 12 13 14 15

Al insertar el 10, se produce un desequilibrio en el nodo 14:

7 4 2 1 3 5
10 14

6
11

12 13

15

El equilibrio se restaura por medio de una rotacin simple:

7 4 2 1 3 5 6
10 11 13 12 14 15

Al insertar el 9, se viola la condicin de equilibrio en el nodo 11:

7 4 2 1 3 5 9 6
10 11 13 12 14 15

El equilibrio se restablece por medio de una rotacin simple:

7 4 2 1 3 5 6
9 10 12 14 15

11 13

Finalmente, el 8 se inserta sin inconvenientes:

7 4 2 1 3 5 8 6
9 10 12 14 15

11 13

11.- rboles B (Btrees) Los rboles B son rboles cuyos nodos pueden tener un nmero mltiple de hijos y un nmero mltiple de elementos. La siguiente figura muestra un esquema general de un nodo de un rbol B. P1 e1 P2 e2 . . . en-1 Pn

donde Pi : Apuntador al i-simo hijo del nodo. ei : i-simo elemento del nodo

El conjunto de elementos o claves que se encuentran en un nodo cumplen la condicin:

e1 < e2 < . . . < en-1


de forma que los elementos que se encuentran en el primer hijo tienen una clave con valor menor que e1, los que se encuentran en el segundo hijo tienen una clave con valor mayor que e1 y menor que e2, etc. Finalmente, los elementos que se encuentran en el ltimo hijo tienen una clave con valor mayor que la ltima clave. que el nodo puede tener menos de m hijos y por consiguiente menos de m-1 claves). De una manera ms formal, un rbol B es un rbol n-ario ordenado y balanceado en el cual, cada nodo tiene como mximo (n-1) elementos y n subrboles asociados, los cuales son a su vez rboles B. Un rbol B de orden n se define como sigue: 1. Cada nodo en el rbol B tiene la siguiente estructura: donde: P1, e1, P2, e2, , Pq1, eq1, Pq qn i ( 1 i q ) (Pi es un apuntador a otro nodo del rbol B) i ( 1 i < q ) (ei es una clave del rbol B)

2. En cada nodo del rbol B se verifica que i ( 1 i < q1 ) ( ei < ei+1 ) 3. Para toda clave x en el subrbol apuntado por Pi se verifica que: ( 1 < i < q ) ( ei1 < x < ei ) ( i = q ) ( ei1 < x ) ( i = 1 ) ( x < ei )

4. Todo nodo interior en un rbol B tiene a lo sumo n hijos.

5. Un nodo interior con q descendientes, q n, contiene exactamente q1 claves. 6. Todo nodo interior, excepto el nodo raz, tiene por lo menos (p/2) hijos. 7. Si el nodo raz es un nodo interior entonces tiene por lo menos 2 hijos.

8. Todo nodo hoja contiene por lo menos (p/2) 1 claves y a lo sumo p1 claves. 9. Todos los nodos hoja se encuentran en el mismo nivel. Bsqueda en un rbol B Localizar una clave en un B-rbol es una operacin simple, pues consiste en situarse en el nodo raz del rbol, si la clave se encuentra all la bsqueda finaliza, y si no es as, se selecciona de entre los hijos el que se encuentra entre dos valores de clave que son menor y mayor que la clave. El proceso contina recursivamente hasta encontrar la clave o llegar a un nodo hoja. En caso de que se llegue a una hoja y no podamos proseguir la bsqueda la clave no se encuentra en el rbol. En definitiva, los pasos a seguir son los siguientes: 1. Seleccionar como nodo actual la raz del rbol. 2. Comprobar si la clave se encuentra en el nodo actual: 3. Si la clave est, fin. 4. Si la clave no est: Si estamos en una hoja, no se encuentra la clave. Fin. Si no estamos en una hoja, hacer nodo actual igual al hijo que corresponde, segn el valor de la clave a buscar y volver al segundo paso.

Insercin en un rbol B Para insertar una nueva clave usaremos un algoritmo que consiste en dos pasos recursivos: 1. Buscamos la hoja donde debera encontrarse el valor de la clave de manera anloga a la descrita en la seccin anterior (si el proceso de bsqueda indica que la clave se encuentra en el rbol, el algoritmo no debe hacer nada ms). Si la clave no se encuentra en el rbol, el nodo actual ser una hoja, que es justamente el lugar donde debe realizarse la insercin. 2. Situados en un nodo donde realizar la insercin, si este no est completo, es decir, si el nmero de claves que existen es menor que el orden menos 1 del rbol, el elemento puede ser insertado y el algoritmo termina. En caso de que el nodo est completo, insertamos la clave en su posicin y dado que la cantidad de claves excede la capacidad del nodo, ste se divide en dos nuevos nodos conteniendo cada uno de ellos la mitad de las claves y tomando una de stas para insertarla en el padre (se usar la mediana). Si el padre est tambin completo, habr que repetir el proceso de manera recursiva, hasta llegar a la raz. En caso de que la raz est completa, la altura del rbol aumenta en uno creando un nuevo nodo raz con una nica clave.

En la figura 2 podemos observar el efecto de insertar una nueva clave en un nodo que est lleno.

Eliminacin en un rbol B

La idea para realizar el borrado de una clave es similar a la insercin, teniendo en cuenta que ahora, en lugar de divisiones, realizamos uniones. Existe un problema aadido, las claves a borrar pueden aparecer en cualquier lugar del rbol y por consiguiente no coincide con el caso de la insercin en la que siempre comenzamos desde una hoja y propagamos hacia arriba. La solucin a esto es inmediata pues cuando borramos una clave que est en un nodo interior, lo primero que realizamos es un intercambio de este valor con el inmediato sucesor en el rbol, es decir, el hijo ms a la izquierda del hijo derecho de esa clave. Las operaciones a realizar para poder llevar a cabo el borrado son por tanto:

1. Redistribucin: La utilizaremos en el caso en que al borrar una clave el nodo se queda con un nmero menor que el mnimo y uno de los hermanos adyacentes tiene al menos uno ms que ese mnimo, es decir, redistribuyendo podemos solucionar el problema. 2. Unin: La utilizaremos en el caso de que no sea posible la redistribucin y por tanto slo ser posible unir los nodos junto con la clave que los separa y se encuentra en el padre. En definitiva, el algoritmo nos queda como sigue: 1. Localizar el nodo donde se encuentra la clave. 2. Si el nodo localizado no es una hoja, intercambiar el valor de la clave localizada con el valor de la clave ms a la izquierda del hijo a la derecha. Esto tiene como objetivo colocar la clave a borrar en una hoja. Dicha hoja pasa a ser el nodo actual. 3. Borrar la clave. 4. Si el nodo actual contiene al menos el mnimo de claves como para seguir siendo un rbol B, fin. 5. Si el nodo actual tiene un nmero menor que el mnimo: 6. Si un nodo hermano tiene ms del mnimo de claves, se agrupa el nodo actual con el nodo hermano y con el elemento del nodo padre que est entre ambos, el elemento mediano del conjunto resultante se promueve al padre, y el resto de elementos se distribuye equitativamente entre las dos pginas. 7. Si ninguno de los hermanos tiene ms del mnimo, se produce el efecto inverso a la divisin, los dos nodos se agrupan en uno solo. A este nodo se le aade el elemento central que estaba situado en el nodo padre. A continuacin se ver un ejemplo grfico. Consideremos el siguiente rbol B

Al eliminar la clave 18, el resultado es el siguiente:

Construccin de un rbol B: inserciones, divisiones (split) y promociones (promotion) Construir un rbol B de orden 4 a partir de la siguiente secuencia de claves. C, S, D, T, A, M, P, I, B, W, N, G, U, R, K, E, H, O, L, J, Y, Q, Z, F, X, V Realice el proceso de construccin paso a paso. La insercin de las claves C, S y D se realiza en el nodo inicial:

CDS

La insercin de T origina la divisin del nodo inicial y la promocin de S:

S CD T

La insercin de A se realiza sin mayores inconvenientes:

S ACD T

La insercin de M origina otra divisin y la promocin de D:

DS AC M T

Las claves P, I, B y W son insertadas en los nodos existentes:

DS ABC I MP TW

La insercin de N ocasiona otra divisin, seguida por la promocin de N. Las claves G, U y R son insertadas en los nodos existentes:

DNS ABC G I M PR T UW

La insercin de K ocasiona una divisin en el nivel de las hojas, seguida por la promocin de K. Esta operacin produce una divisin del nodo raz. N es promovida y pasa a estar en el nuevo nodo raz. E es insertado en una hoja:

DK ABC EG I M PR

S T UW

La insercin de H origina la divisin de un nodo hoja. H es promovida. O, L y J son insertados en los nodos existentes:

DHK ABC EG I J LM OP R

S T UW

La insercin de Y y Q origina dos divisiones a nivel de las hojas, seguidas de las promociones correspondientes. Las claves Z, F, X, y V son insertadas en los nodos existentes, sin mayores inconvenientes. El rbol B de orden 4 resultante es el siguiente:

DHK ABC E FG I J LM OP R

QSW T UV X Y Z