何が起こるかを理解しなければならない問題は、使用している表現モデルが悪いためです。ポインターに関連付けられた1つのデータ値と、データ値がポインターによって参照されるサブツリー内の最小値であるという不変条件が必要です。
したがって、これは、挿入前にbツリーノードを表す方法です。
10|21|30|50| <--- root node
10|20| 21|22|25| 30|40| 50|60|80| <--- leaf nodes
この表現では、ルートノードの値10の後のポインターは、最初の値10などのリーフノードを指しています。
23を挿入すると、最初の値が21のリーフノードに挿入されます。これにより、次のツリーが生成され、分割する必要はありません。
10|21|30|50| <--- root node
10|20| 21|22|23|25| 30|40| 50|60|80| <--- leaf nodes
あなたが説明した効果を生み出す24を挿入すると、次のようになります。
10|30| <--- new root node
10|21|24| 30|50| <--- intermediate nodes
10|20| 21|22|23| 24|25| 30|40| 50|60|80| <--- leaf nodes
ご覧のとおり、あいまいさはもうありません。リーフノードが分割され、キーポインタペア24 | ルートノードに挿入する必要がありました。いっぱいだったので、分割する必要がありました。5つの値があるので、3つの値を持つ1つのノードと2つの1つのノードを取得します。左側のノードと右側のノードのどちらが3つの値を取得するかを自由に選択できます。重要なのは、基本的な不変条件が保持されることです。ノードの各キー値は、関連するポインターによって参照されるサブツリー内の最小要素です。新しいルートノードを追加する必要があり、そのキー値ポインタセットが明確になっているはずです。あいまいさはありません。
これはまた、多くの最適化戦略が可能であることを明らかにします。ルートノードを分割する代わりに、値21をいっぱいではない左側のリーフノードに移動することもできます。最初の値が10の場合。これにより、ルートノードを分割する必要がなくなり、bツリーの高さを変更せずに維持し、bツリーの塗りつぶしを改善できます。したがって、スペースと検索時間を最小限に抑えることができます。しかし、これは、横方向のバランス調整が実行可能かどうかを効率的に確認できることを意味します。ルートノードのキー値の変更は引き続き必要です。等
ご覧のとおり、bツリーの値10は、リーフノードがない場合は実際には必要ありません。bツリー表現(つまり、ウィキペディア)では省略されることがよくありますが、混乱を招く可能性があり、おそらくここにいる理由です。:)