Penso che tu abbia la tua creazione della pagina sottosopra. Quando un nodo divide non crea più nodi verso il basso della gerarchia (nodi figlio nella vostra nomenclatura). Invece crea più verso l'alto , verso la radice. Come dice il libro
Si noti che la crescita è nella parte superiore dell'albero e questa è una caratteristica intrinseca di un albero B per garantire le proprietà importanti di avere sempre tutte le foglie allo stesso livello e ogni nodo diverso dalla radice è almeno Pieno al 50%.
(La mia enfasi.)
Dall'ebook collegato:
Definizione 5.1 AB - albero dell'ordine m (m ≥ 3) ... ogni nodo contiene al massimo m - 1 chiavi
L'esercizio è per m = 3, quindi al massimo 2 chiavi per nodo.
I primi due tasti sono facili: vanno nella prima pagina:
A:[1,2]
Userò l'arte ASCII. Etichetta ogni pagina nella sequenza in cui sono state create e mostrerò i tasti / puntatori all'interno della pagina. Quindi la pagina P contenente i valori chiave k1 e k2 sarà P:[k1,k2]
.
Ora arriva il tasto 3. Secondo la Sezione 5.2.1 ... Inserimento, il primo compito è la ricerca. Questo determina che la chiave 3 dovrebbe essere nella pagina A - l'unica pagina che abbiamo. Inoltre "se [quel nodo] è pieno, sarà diviso in due nodi." La pagina è piena, quindi deve essere divisa. Ora abbiamo
A:[1,2] B:[3, ]
Ma questo non è un albero! Come dice il libro:
il puntatore al [nuovo nodo], .. viene inserito nel nodo padre .. del [nodo corrente], ripetendo l'operazione di inserimento in questo nodo [cioè il nodo padre]. Questo processo di divisione e spostamento può continuare, se necessario, fino alla radice e, se necessario, suddividere, verrà creato un nuovo nodo radice.
(La mia enfasi per mostrare l'elaborazione continua sull'albero verso la radice, non verso le foglie.)
Quindi dobbiamo mettere un puntatore alla nuova pagina (B) nel padre della pagina corrente (A). Ci deve essere un nuovo nodo radice:
C:[2,3]
/ \
A:[1,2] B:[3, ]
Ho i puntatori nelle pagine non foglia che puntano al valore più alto in un nodo figlio (figlio). Il testo collegato può fare diversamente, ma il risultato sarà equivalente.
Il valore chiave 4 arriva; seguendo l'algoritmo cerchiamo per trovare su quale pagina dovrebbe trovarsi. Dovrebbe essere la pagina B. C'è spazio per esso, quindi aggiorniamo quella pagina e il puntatore nella pagina C:
C:[2,4]
/ \
A:[1,2] B:[3,4]
Successivamente inseriamo la chiave 5. Dovrebbe andare nella pagina B ma è piena. Pertanto si divide
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
Dobbiamo aggiornare il nodo padre. Anche questo è pieno, quindi si divide:
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
La divisione si propaga e si forma un nuovo nodo radice:
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
Crescendo verso l'alto l'albero mantiene la stessa profondità in ogni ramo. Questo è importante per prestazioni prevedibili. (Alcuni dicono che la B in B-Tree sta per "bilanciato" proprio per questo motivo.)
Per quanto riguarda la seconda parte: "È possibile inserire i record con le chiavi in un ordine diverso per avere un albero di altezza inferiore?" Con 5 chiavi e due chiavi per nodo abbiamo bisogno di almeno 3 nodi foglia per contenere tutti i valori e un'altezza di 3 per formare l'albero. Quindi la mia disposizione è ottimale per i dati, la sequenza e l'algoritmo forniti.
Il libro utilizza una disposizione del puntatore molto diversa da quella che uso e una diversa disposizione della divisione della pagina. Questo sarà significativo, portando a pagine parzialmente piene. Che ci sia una sezione a pagina 42 chiamata "Caricamento dei dati" che mostra come ottenere pagine più piene caricando la sequenza di tasti supporta il mio sospetto. Tuttavia, spero di averti dato sufficienti indicazioni e sarai in grado di utilizzare la struttura dei puntatori del libro per risolverlo da solo.
Mi sono imbattuto in questa simulazione interattiva di come cresce un B-Tree.