class BTree
{
final int MAX = 4;
final int MIN = 2;
//15 21 35 42 29 11 12 18 20 23 25 27 31 33 36 39 45 47 50 55 B-Tree of order 5
class BTNode
{
int count;
int key[] = new int[MAX+1];
BTNode child[] = new BTNode[MAX+1];
}
BTNode root = new BTNode();
{ int m;
}
void insertTree( int val )
{
BTNode c = new BTNode();
BTNode node = new BTNode();
pushup = pushDown( val, root, i, c );
if ( pushup )
{
node.count = 1;
node.key[1] = i.m;
node.child[0] = root;
node.child[1] = c;
root = node;
}
}
boolean pushDown
( int val, BTNode node,
Ref p, BTNode c
) {
if ( node == null )
{
p.m = val;
c = null;
return true;
}
else {
if ( searchNode( val, node, k ) )
System.
out.
println("Key already exists."); if ( pushDown( val, node.child[k.m], p, c ) )
{
if ( node.count < MAX )
{
pushIn( p.m, c, node, k.m );
return false;
}
else
{
split( p.m, c, node, k.m, p, c );
return true;
}
}
return false;
}
}
BTNode searchTree
( int val, BTNode root,
Ref pos
){
if ( root == null ) return null ;
else
{
if ( searchNode( val, root, pos ) )
return root;
else
return searchTree( val, root.child[pos.m], pos );
}
}
boolean searchNode
( int val, BTNode node,
Ref pos
) {
if ( val < node.key[1] )
{
pos.m = 0 ; return false ;
}
else
{
pos.m = node.count ;
while ( ( val < node.key[pos.m] ) && pos.m > 1 )
(pos.m)--;
if ( val == node.key[pos.m] )
return true;
else
return false;
}
}
void pushIn( int val, BTNode c, BTNode node, int k )
{
int i ;
for ( i = node.count; i > k ; i-- )
{
node.key[i + 1] = node.key[i];
node.child[i + 1] = node.child[i];
}
node.key[k + 1] = val ;
node.child[k + 1] = c ;
node.count++ ;
}
void split
( int val, BTNode c, BTNode node,
int k,
Ref y, BTNode newnode
) {
int i, mid;
if ( k <= MIN )
mid = MIN;
else
mid = MIN + 1;
newnode = new BTNode();
for ( i = mid+1; i <= MAX; i++ )
{
newnode.key[i-mid] = node.key[i];
newnode.child[i-mid] = node.child[i];
}
newnode.count = MAX - mid;
node.count = mid;
if ( k <= MIN ) pushIn ( val, c, node, k );
else
pushIn ( val, c, newnode, k-mid ) ;
y.m = node.key[node.count];
newnode.child[0] = node.child[node.count] ;
node.count-- ;
}
void displayTree()
{
display( root );
}
void display( BTNode root )
{
int i;
if ( root != null ) {
for ( i = 0; i < root.count; i++ )
{
display( root.child[i] );
System.
out.
print( root.
key[i
+1] + " " ); }
display( root.child[i] );
}
}
}
class BTreeDemo
{
public static void main
( String[] args
) {
BTree bt = new BTree();
int[] arr = { 11, 23, 21, 12, 31, 18, 25, 35, 29, 20, 45, 27, 42, 55, 15, 33, 36, 47, 50, 39 };
for ( int i = 0; i < arr.length; i++ )
bt.insertTree( arr[i] );
System.
out.
println("B-Tree of order 5:"); bt.displayTree();
}
}
CmNsYXNzIEJUcmVlCnsKZmluYWwgaW50IE1BWCA9IDQ7CmZpbmFsIGludCBNSU4gPSAyOwovLzE1IDIxIDM1IDQyIDI5IDExIDEyIDE4IDIwIDIzIDI1IDI3IDMxIDMzIDM2IDM5IDQ1IDQ3IDUwIDU1IEItVHJlZSBvZiBvcmRlciA1CmNsYXNzIEJUTm9kZQp7CmludCBjb3VudDsKaW50IGtleVtdID0gbmV3IGludFtNQVgrMV07CkJUTm9kZSBjaGlsZFtdID0gbmV3IEJUTm9kZVtNQVgrMV07Cn0KQlROb2RlIHJvb3QgPSBuZXcgQlROb2RlKCk7CmNsYXNzIFJlZgp7IGludCBtOwp9CnZvaWQgaW5zZXJ0VHJlZSggaW50IHZhbCApCnsKUmVmIGkgPSBuZXcgUmVmKCk7CkJUTm9kZSBjID0gbmV3IEJUTm9kZSgpOwpCVE5vZGUgbm9kZSA9IG5ldyBCVE5vZGUoKTsKQm9vbGVhbiBwdXNodXA7CnB1c2h1cCA9IHB1c2hEb3duKCB2YWwsIHJvb3QsIGksIGMgKTsKaWYgKCBwdXNodXAgKQp7Cm5vZGUuY291bnQgPSAxOwpub2RlLmtleVsxXSA9IGkubTsKbm9kZS5jaGlsZFswXSA9IHJvb3Q7Cm5vZGUuY2hpbGRbMV0gPSBjOwpyb290ID0gbm9kZTsKfQp9CmJvb2xlYW4gcHVzaERvd24oIGludCB2YWwsIEJUTm9kZSBub2RlLCBSZWYgcCwgQlROb2RlIGMgKQp7ClJlZiBrID0gbmV3IFJlZigpOwppZiAoIG5vZGUgPT0gbnVsbCApCnsKcC5tID0gdmFsOwpjID0gbnVsbDsKcmV0dXJuIHRydWU7Cn0KZWxzZSB7CmlmICggc2VhcmNoTm9kZSggdmFsLCBub2RlLCBrICkgKQpTeXN0ZW0ub3V0LnByaW50bG4oIktleSBhbHJlYWR5IGV4aXN0cy4iKTsKaWYgKCBwdXNoRG93biggdmFsLCBub2RlLmNoaWxkW2subV0sIHAsIGMgKSApCnsKaWYgKCBub2RlLmNvdW50IDwgTUFYICkKewpwdXNoSW4oIHAubSwgYywgbm9kZSwgay5tICk7CnJldHVybiBmYWxzZTsKfQplbHNlCnsKc3BsaXQoIHAubSwgYywgbm9kZSwgay5tLCBwLCBjICk7CnJldHVybiB0cnVlOwp9Cn0KcmV0dXJuIGZhbHNlOwp9Cn0KQlROb2RlIHNlYXJjaFRyZWUoIGludCB2YWwsIEJUTm9kZSByb290LCBSZWYgcG9zICkKewppZiAoIHJvb3QgPT0gbnVsbCApIHJldHVybiBudWxsIDsKZWxzZQp7CmlmICggc2VhcmNoTm9kZSggdmFsLCByb290LCBwb3MgKSApCnJldHVybiByb290OwplbHNlCnJldHVybiBzZWFyY2hUcmVlKCB2YWwsIHJvb3QuY2hpbGRbcG9zLm1dLCBwb3MgKTsKfQp9CmJvb2xlYW4gc2VhcmNoTm9kZSggaW50IHZhbCwgQlROb2RlIG5vZGUsIFJlZiBwb3MgKQp7CmlmICggdmFsIDwgbm9kZS5rZXlbMV0gKQp7CnBvcy5tID0gMCA7IHJldHVybiBmYWxzZSA7Cn0KZWxzZQp7CnBvcy5tID0gbm9kZS5jb3VudCA7CndoaWxlICggKCB2YWwgPCBub2RlLmtleVtwb3MubV0gKSAmJiBwb3MubSA+IDEgKQoocG9zLm0pLS07CmlmICggdmFsID09IG5vZGUua2V5W3Bvcy5tXSApCnJldHVybiB0cnVlOwplbHNlCnJldHVybiBmYWxzZTsKfQp9CnZvaWQgcHVzaEluKCBpbnQgdmFsLCBCVE5vZGUgYywgQlROb2RlIG5vZGUsIGludCBrICkKewppbnQgaSA7CmZvciAoIGkgPSBub2RlLmNvdW50OyBpID4gayA7IGktLSApCnsKbm9kZS5rZXlbaSArIDFdID0gbm9kZS5rZXlbaV07Cm5vZGUuY2hpbGRbaSArIDFdID0gbm9kZS5jaGlsZFtpXTsKfQpub2RlLmtleVtrICsgMV0gPSB2YWwgOwpub2RlLmNoaWxkW2sgKyAxXSA9IGMgOwpub2RlLmNvdW50KysgOwp9CnZvaWQgc3BsaXQoIGludCB2YWwsIEJUTm9kZSBjLCBCVE5vZGUgbm9kZSwgaW50IGssIFJlZiB5LCBCVE5vZGUgbmV3bm9kZSApCnsKaW50IGksIG1pZDsKaWYgKCBrIDw9IE1JTiApCm1pZCA9IE1JTjsKZWxzZQptaWQgPSBNSU4gKyAxOwpuZXdub2RlID0gbmV3IEJUTm9kZSgpOwpmb3IgKCBpID0gbWlkKzE7IGkgPD0gTUFYOyBpKysgKQp7Cm5ld25vZGUua2V5W2ktbWlkXSA9IG5vZGUua2V5W2ldOwpuZXdub2RlLmNoaWxkW2ktbWlkXSA9IG5vZGUuY2hpbGRbaV07Cn0KbmV3bm9kZS5jb3VudCA9IE1BWCAtIG1pZDsKbm9kZS5jb3VudCA9IG1pZDsKaWYgKCBrIDw9IE1JTiApIHB1c2hJbiAoIHZhbCwgYywgbm9kZSwgayApOwplbHNlCnB1c2hJbiAoIHZhbCwgYywgbmV3bm9kZSwgay1taWQgKSA7CnkubSA9IG5vZGUua2V5W25vZGUuY291bnRdOwpuZXdub2RlLmNoaWxkWzBdID0gbm9kZS5jaGlsZFtub2RlLmNvdW50XSA7Cm5vZGUuY291bnQtLSA7Cn0Kdm9pZCBkaXNwbGF5VHJlZSgpCnsKZGlzcGxheSggcm9vdCApOwp9IAp2b2lkIGRpc3BsYXkoIEJUTm9kZSByb290ICkKewppbnQgaTsKaWYgKCByb290ICE9IG51bGwgKSB7CmZvciAoIGkgPSAwOyBpIDwgcm9vdC5jb3VudDsgaSsrICkKewpkaXNwbGF5KCByb290LmNoaWxkW2ldICk7ClN5c3RlbS5vdXQucHJpbnQoIHJvb3Qua2V5W2krMV0gKyAiICIgKTsKfQpkaXNwbGF5KCByb290LmNoaWxkW2ldICk7Cn0KfQp9CmNsYXNzIEJUcmVlRGVtbwp7CnB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKewpCVHJlZSBidCA9IG5ldyBCVHJlZSgpOwppbnRbXSBhcnIgPSB7IDExLCAyMywgMjEsIDEyLCAzMSwgMTgsIDI1LCAzNSwgMjksIDIwLCA0NSwgMjcsIDQyLCA1NSwgMTUsIDMzLCAzNiwgNDcsIDUwLCAzOSB9Owpmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKysgKQpidC5pbnNlcnRUcmVlKCBhcnJbaV0gKTsKU3lzdGVtLm91dC5wcmludGxuKCJCLVRyZWUgb2Ygb3JkZXIgNToiKTsKYnQuZGlzcGxheVRyZWUoKTsKfQp9Cg==