Académique Documents
Professionnel Documents
Culture Documents
El Problema
•
Estructuras de Datos
ABB
Estructuras de Datos
ABB
Estructuras de Datos
AVL
Estructuras de Datos
Solución
Estructuras de Datos
Árbol B
Estructuras de Datos
Arboles B
Estructuras de Datos
Arboles B
Estructuras de Datos
Características
Estructuras de Datos
Características
Estructuras de Datos
Características
Estructuras de Datos
Propiedades
Estructuras de Datos
TAD
Estructuras de Datos
OPERACIONES BÁSICAS
Estructuras de Datos
Búsqueda
int buscarNodo(Pagina* actual, tipoClave cl, int* k)
{
int encontrado;
Búsqueda
Pagina* buscar(Pagina* actual, tipoClave cl, int* indice)
{
if (actual == NULL)
{
return NULL;
}
else {
int esta;
esta = buscarNodo(actual,cl,indice);
if (esta)
return actual;
else
return buscar(actual -> ramas[*indice],cl,indice);
}
}
Estructuras de Datos
INSERCIÓN
Estructuras de Datos
Ejemplo
• Insertar los siguientes ítems en un árbol B inicialmente vacío de
orden m=5: 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27,
8, 32, 38, 24, 45, 25
Estructuras de Datos
Ejemplo
• Insertar los siguientes ítems en un árbol B inicialmente vacío de
orden m=5: 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27,
8, 32, 38, 24, 45, 25
Estructuras de Datos
Ejemplo
• Insertar los siguientes ítems en un árbol B inicialmente vacío de
orden m=5: 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27,
8, 32, 38, 24, 45, 25
Estructuras de Datos
Ejemplo
• Insertar los siguientes ítems en un árbol B inicialmente vacío de
orden m=5: 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27,
8, 32, 38, 24, 45, 25
Estructuras de Datos
Ejemplo
• Insertar los siguientes ítems en un árbol B inicialmente vacío de
orden m=5: 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27,
8, 32, 38, 24, 45, 25
Estructuras de Datos
Inserción
void insertar(Pagina**raiz, tipoClave cl)
{
int subeArriba;
tipoClave mediana;
Pagina *p,*nd;
if (subeArriba)
{
p = (Pagina*) malloc(sizeof(Pagina));
p -> cuenta = 1;
p -> claves[1] = mediana;
p -> ramas[0] = *raiz;
p -> ramas[1] = nd;
*raiz = p;
}
}
Estructuras de Datos
Inserción
void empujar(Pagina* actual, tipoClave cl, int* subeArriba,
tipoClave* mediana,
Pagina** nuevo)
{
int k;
if (actual == NULL)
{
*subeArriba = 1;
*mediana = cl;
*nuevo = NULL;
}
else {
int esta;
esta = buscarNodo(actual,cl,&k);
if (esta)
{
puts(“\nClave duplicada”);
*subeArriba = 0;
return;
}
Estructuras de Datos
Inserción
empujar(actual->ramas[k], cl, subeArriba, mediana,
nuevo);
if (*subeArriba)
{
if (nodoLLeno(actual))
dividirNodo(actual, *mediana, *nuevo, k,
mediana, nuevo);
else
{
*subeArriba = 0;
meterHoja(actual, *mediana, *nuevo, k);
}
}
}
}
Estructuras de Datos
Inserción
void dividirNodo( Pagina* actual, tipoClave cl, Pagina* rd,
int k, tipoClave*
mediana, Pagina** nuevo)
{
int i, posMdna;
Inserción
(*nuevo)-> cuenta = (m-1) – posMdna;/* claves en el nuevo nodo */
actual -> cuenta = posMdna; /* claves en el nodo origen */
*mediana = actual->claves[actual->cuenta];
/* Rama0 del nuevo nodo es la rama de la mediana */
(*nuevo) -> ramas[0] = actual->ramas[actual->cuenta];
actual->cuenta-- ; /* disminuye ya que se quita la mediana */
}
Estructuras de Datos
Inserción
Eliminación
Estructuras de Datos
Ejemplo
• Eliminar los siguientes Valores:
• 10, 18,15
Estructuras de Datos
Eliminación
void eliminar(Pagina**raiz, tipoClave cl)
{
int encontrado;
Eliminación
void eliminarRegistro(Pagina* actual, tipoClave cl,
int* encontrado)
{
int k;
if (actual != NULL)
{
*encontrado = buscarNodo(actual, cl, &k);
if (*encontrado)
{
if (actual->ramas[k-1] == NULL) /* es un nodo hoja */
quitar(actual, k);
else {
sucesor(actual, k);
/* se elimina la clave sucesora en su nodo */
eliminarRegistro(actual->ramas[k], actual->claves[k],
encontrado);
}
}
Estructuras de Datos
Eliminación
else {
eliminarRegistro(actual->ramas[k], cl, encontrado);
}
/* Las llamadas recursivas devuelven control a este punto.
Se comprueba el número de claves del nodo descendiente,
desde el nodo actual en la ruta de búsqueda seguida. */
if (actual->ramas[k] != NULL)
if (actual->ramas[k]->cuenta < m/2)
restablecer(actual,k);
}
else
*encontrado = 0;
}
Estructuras de Datos
Eliminación
void quitar(Pagina* actual, int k)
{
int j;
Eliminación
Eliminación
void restablecer(Pagina* actual, int k)
{
/* actual tiene la dirección del nodo antecedente de
actual -> ramas[k] que tiene menos claves que el mínimo */
Eliminación
void moverDrcha(Pagina* actual, int k)
{
int j;
Pagina* nodoProblema = actual->ramas[k];
Pagina* nodoIzqdo = actual->ramas[k-1];
actual->claves[k] = nodoIzqdo->claves[nodoIzqdo->cuenta];
nodoProblema->ramas[0] = nodoIzqdo->ramas[nodoIzqdo->cuenta];
nodoIzqdo -> cuenta-- ;
}
Estructuras de Datos
Eliminación
void moverIzqda(Pagina* actual, int k)
{
int j;
Pagina* nodoProblema = actual->ramas[k-1];
Pagina* nodoDrcho = actual->ramas[k];
}
Estructuras de Datos
Eliminación
void combina(Pagina* actual, int k)
{
int j;
Pagina *nodoIzqdo, *q;
Eliminación
/* Se ajustan claves y ramas del nodo padre debido a que
antes descendió la clave k */
for (j = k; j <= actual->cuenta-1; j++)
{
actual -> claves[j] = actual -> claves[j+1];
actual -> ramas[j] = actual -> ramas[j+1];
}
actual->cuenta-- ;
free(q);
}
Estructuras de Datos
Fuentes
• Estructuras de Datos en C++;
Joyanes Aguilar, Luis;
• Mc Graw Hill, 2008
CAPITULO 16
Estructuras de Datos
Ejercicio
• Dada la secuencia de claves enteras:190,57,89,90,121,170,35,48,
91,22,126,132 y 80;dibuje el árbol B de orden 5, que se
corresponde con dichas claves.
•
Estructuras de Datos
Resultado