Creo que tienes la creación de tu página al revés. Cuando un nodo se divide, no crea más nodos en la jerarquía (nodos hijos en su nomenclatura). En cambio, crea más hacia arriba , hacia la raíz. Como dice el libro
Tenga en cuenta que el crecimiento está en la parte superior del árbol, y esta es una característica intrínseca de un árbol B para garantizar las propiedades importantes de que siempre tiene todas las hojas al mismo nivel, y que cada nodo diferente de la raíz es al menos 50% lleno.
(Mi énfasis)
Del libro electrónico vinculado:
Definición 5.1 AB – árbol de orden m (m ≥ 3) ... cada nodo contiene como máximo m - 1 claves
El ejercicio es para m = 3, por lo tanto, como máximo 2 teclas por nodo.
Las dos primeras teclas son fáciles: van a la primera página:
A:[1,2]
Voy a usar el arte ASCII. Etiquetaré cada página en la secuencia en que fueron creadas y mostraré las teclas / punteros dentro de la página. Entonces la página P que contiene los valores clave k1 y k2 será P:[k1,k2]
.
Ahora aparece la clave 3. De acuerdo con la Sección 5.2.1 ... Inserción, la primera tarea es buscar. Esto determina que la clave 3 debe estar en la página A, la única página que tenemos. Además "si [ese nodo] está lleno, se dividirá en dos nodos". La página está llena, por lo que debe dividirse. Ahora tenemos
A:[1,2] B:[3, ]
¡Pero esto no es un árbol! Como dice el libro:
el puntero a [el nuevo nodo], .. se inserta en el nodo padre .. de [el nodo actual], repitiendo la operación de inserción en este nodo [es decir, el nodo padre]. Este proceso de división y avance puede continuar si es necesario hasta la raíz, y si se debe dividir, se creará un nuevo nodo raíz.
(Mi énfasis en mostrar el procesamiento continúa hacia arriba del árbol hacia la raíz, no hacia las hojas).
Por lo tanto, debemos poner un puntero a la nueva página (B) en el padre de la página actual (A). Debe haber un nuevo nodo raíz:
C:[2,3]
/ \
A:[1,2] B:[3, ]
Tengo los punteros en páginas que no son hojas que apuntan al valor más alto en un nodo hijo (hijo). Su texto vinculado puede hacer esto de manera diferente, pero el resultado será equivalente.
Llega el valor clave 4; siguiendo el algoritmo buscamos para encontrar en qué página debería estar. Debería ser la página B. Hay espacio para ella, así que actualizamos esa página y el puntero en la página C:
C:[2,4]
/ \
A:[1,2] B:[3,4]
Luego insertamos la clave 5. Debería ir en la página B pero está llena. Por lo tanto, se divide
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
Debemos actualizar el nodo padre. También está lleno, por lo que se divide:
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
La división se propaga y se forma un nuevo nodo raíz:
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
Al crecer hacia arriba, el árbol mantiene una profundidad idéntica en cada rama. Esto es importante para un rendimiento predecible. (Algunos dicen que B en B-Tree significa "equilibrado" por esta misma razón).
En cuanto a la segunda parte: "¿Es posible ingresar los registros con claves en un orden diferente para tener un árbol de menor altura?" Con 5 claves y dos claves por nodo, necesitamos al menos 3 nodos de hoja para contener todos los valores y una altura de 3 para formar el árbol. Entonces, mi disposición es óptima para los datos, la secuencia y el algoritmo dados.
El libro usa una disposición de puntero muy diferente a la que yo uso, y una disposición de división de página diferente. Esto será significativo y llevará a páginas parcialmente completas. Que hay una sección en la página 42 llamada "Carga de datos" que muestra cómo se pueden lograr páginas más completas al cargar la secuencia de teclas. Sin embargo, espero haberte dado suficientes punteros y podrás usar la estructura de punteros del libro para resolverlo por ti mismo.
Me he encontrado con esta simulación interactiva de cómo crece un B-Tree.