ページの作成が逆さまになっていると思います。ノードが分割されても、階層の下に追加のノードは作成されません(命名法の子ノード)。代わりに、ルートに向かってより上向きに作成します。本が言うように
成長はツリーの最上部にあり、これはBツリーの本質的な特性であり、常にすべてのリーフが同じレベルにあり、ルートとは異なる各ノードが少なくとも50%満杯。
(私の強調)
リンクされた電子ブックから:
定義5.1 AB –次数mのツリー(m≥3)...各ノードには最大でm − 1個のキーが含まれます
演習はm = 3のため、ノードあたり最大2つのキーです。
最初の2つのキーは簡単です。最初のページに移動します。
A:[1,2]
アスキーアートを使用します。作成した順に各ページにラベルを付け、ページ内のキー/ポインタを表示します。したがって、キー値k1とk2を含むページPはになりますP:[k1,k2]
。
次にキー3が表示されます。セクション5.2.1 ...挿入によると、最初のタスクは検索です。これにより、キー3がページA(唯一のページ)にあることが決定されます。さらに「[そのノード]がいっぱいになると、2つのノードに分割されます。」ページがいっぱいなので分割する必要があります。私たちは今持っています
A:[1,2] B:[3, ]
しかし、これは木ではありません!本が言うように:
[新規ノード]へのポインタは、..に挿入された父 [すなわち父ノードこのノードで挿入操作を繰り返し、[現在のノード]の..ノード。この分割と上への移動プロセスは、必要に応じてルートまで続行でき、これを分割する必要がある場合は、新しいルートノードが作成されます。
(処理を示すことに私の重点を置いたのは、葉に向かって下がるのではなく、根に向かってツリーを上っていくことです)
そのため、新しいページへのポインター(B)を現在のページの親(A)に入れる必要があります。新しいルートノードが必要です。
C:[2,3]
/ \
A:[1,2] B:[3, ]
子(息子)ノードの最高値を指す非リーフページのポインターがあります。リンクされたテキストではこれが異なる場合がありますが、結果は同じになります。
キー値4が到着します。アルゴリズムに従って、どのページにあるかを検索します。それはページBである必要があります。そのための余地があるので、そのページとページCのポインターを更新します。
C:[2,4]
/ \
A:[1,2] B:[3,4]
次に、キー5を挿入します。Bページに移動するはずですが、いっぱいです。したがって分割します
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
親ノードを更新する必要があります。それもいっぱいなので、分割されます:
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
分割が伝播し、新しいルートノードが形成されます。
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
上向きに成長することにより、ツリーはすべてのブランチで同じ深さを維持します。これは、予測可能なパフォーマンスにとって重要です。(BツリーのBは、まさにこの理由で「バランスの取れた」を表すと言う人もいます。)
2番目の部分については、「キーを使用してレコードを別の順序で入力して、高さの低いツリーを作成することは可能ですか?」ノードごとに5つのキーと2つのキーがあるため、すべての値を保持するために少なくとも3つのリーフノードと、ツリーを形成するために3の高さが必要です。だから私の配置は与えられたデータ、シーケンス、アルゴリズムに最適です。
この本は、私が使用するものとは非常に異なるポインター配置と、異なるページ分割配置を使用しています。これは重要で、ページ全体が表示されます。42ページに「データの読み込み」と呼ばれるセクションがあり、キーシーケンスから読み込むことでページをさらに充実させることができることを示しています。しかし、私はあなたに十分な指針を与えていただければ幸いです。そうすれば、本のポインター構造を使用してそれを自分で解決できるようになります。
Bツリーがどのように成長するかについてのこのインタラクティブなシミュレーションに出くわしました。