Professional Documents
Culture Documents
INSERCIN EN UN RBOL B+
Derecha
Izquierda o derecha
Izquierda y derecha
1
orden de un rbol-B+ es n, cada nodo (exceptuando la raz) debe tener entre n/2 y n claves.
El nmero de claves que pueden ser indexadas usando un rbol-B+ est en funcin del
orden del rbol y su altura.
Para un rbol-B+ de orden n, con una altura h:
El rbol-B+ fue descrito por primera vez en el documento "Rudolf Bayer, Edward M.
McCreight: Organization and Maintenance of Large Ordered Indexes. Acta Informatica 1:
173-189 (1972)".
Es de notar que los arboles-B+ ocupan un poco mas de espacio que los arboles-B, y esto
ocurre al existir duplicidad en algunas claves. Sin embargo, esto es aceptable si el archivo
se modifica frecuentemente, puesto que se evita la operacin de reorganizacin del rbol
que es tan costosa en los arboles-B.
2
5. Todas las claves se encuentran en las paginas hojas.
7. Bsqueda De Arboles-B+
INSERCIN EN RBOLES B+
3
Puede suceder que la pagina antecesora se desborde nuevamente, entonces tendr que repetirse el proceso anterior.
Es importante notar que el desbordamiento en una pagina que no es hoja no produce duplicidad de claves. El
proceso de propagacin puede llegar hasta la raz, en cuyo caso la altura del rbol puede incrementarse en una
unidad. En la figura 8.6 se presentan dos diagramas que clarifican y resuelven este caso.
BORRADO EN ARBOLES-B+
Ejemplo 8.5.3
Suponga que desea eliminar las siguientes claves del rbol-B+ de orden 2 de la figura 8.12:
4
claves: 15-51-48-60-31-20-10-25-17-24
5
ALGORITMO:
class nodo rbol B en c++
#include <iostream.h>
#include <stdlib.h>
struct stclave {
int valor;
long registro;
};
class bnodo {
public:
bnodo (int nClaves); // Constructor
~bnodo (); // Destructor
private:
int clavesUsadas;
stclave *clave;
bnodo **puntero;
bnodo *padre;
BORRADO EN UN B-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.
6
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.
3. Borrar la clave.
4. Si el nodo actual contiene al menos el mnimo de claves como para seguir siendo un B-
rbol,fin.
2. Si ninguno de los hermanos tiene ms del mnimo,unin de dos nodos junto con la
clave del padre y vuelta al paso 4 para propagar el borrado de dicha clave(ahora en
el padre).
6. Codificacin de la Eliminacin en
7. rbol B: eliminar()
8. void eliminar(Pagina**raiz, tipoClave cl)
9. { int encontrado;
10. eliminarRegistro(*raiz, cl, &encontrado);
11. if (encontrado)
12. { printf(Clave %d eliminada\n,cl);
13. if ((*raiz) >
14. cuenta == 0)
15. {/* La raiz est vaca, libera el nodo y se establece la nueva raz */
16. Pagina* p = *raiz;
17. *raiz = (*raiz) >
18. ramas[0];
19. free(p);
20. }
21. }
22. else puts(La clave no se encuentra en el rbol\n);
3. PRIMITIVAS DE UN B-RBOL.
7
AB Crear0(int ne)
{
AB raiz;
l = lenght(nod->etiquetas[]);
for(i=0;inod->etiquetas[i];i++)
;
*pos = i;
if(*posetiquetas[*pos])
return 1;
else;
return 0;
}
enc = Buscar(eti,&nod,&pos);
if (enc == 1)
return 1;
do {
if (etietiquetas[i] && nod->hijos[i]!=NULO)
enc = BuscarNodo(eti,&nod->hijos[i],&pos);
else
8
if ((etietiquetas[i+1]||nod->etiquetas[i+1]==-1)&&nod->hijos[i+1]!=-1)
enc = BuscarNodo(eti,&nod->hijos[i+1],&pos);
i++;
} while (ietiquetas[]) && enc==0);
return (enc);