b算法java实现_java实现B-Tree

package com.algorithm.tree;

import java.lang.reflect.Array;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Iterator;

import java.util.List;

public class BTree> {

public int minDgree;

public int keynum;

public T[] key;

public ArrayList> child;

public boolean isLeaf;

public BTree(){

}

public BTree(T[] array,int minDegree){

BTree btree=new BTree();

btree.isLeaf=true;

btree.minDgree=minDegree;

btree.keynum=0;

btree.key=(T[])Array.newInstance(array.getClass().getComponentType(), 2*minDegree-1);

Arrays.fill(btree.key, 0); /*使用反射得到的数组填充一下再使用,省略此处会产生NullPointerException*/

btree.child=new ArrayList>(2*minDegree);

/*Collections.fill(btree.child, null);使用此方法不会改变size()大小,换句话说此方法填充的元素数量取决于size()而不是capacity()!!!!*/

for(int i=0;i<2*minDegree;i++){

btree.child.add(null);

}

int i=1;

for(T ele:array){

btree=insert(btree,ele);

System.out.println("初始化第"+i+++"个节点");

keynum=btree.keynum;

isLeaf=btree.isLeaf;

key=btree.key;

child=btree.child;

this.minDgree=minDegree;

}

}

public static > void split(BTree parent,int i){

BTree first=parent.child.get(i);

BTree second=new BTree<>();

second.minDgree=parent.minDgree;

second.isLeaf=first.isLeaf;

second.key=(T[])Array.newInstance(parent.key.getClass().getComponentType(), 2*parent.minDgree-1);

second.child=new ArrayList>(2*parent.minDgree);

for(int k=0;k<2*parent.minDgree;k++){

second.child.add(null);

}

int j=parent.minDgree;

int m=0;

while(j

second.key[m]=first.key[j];

second.child.set(m++, first.child.get(j++));

}

second.child.set(m, first.child.get(j));

first.keynum=second.keynum=parent.minDgree-1;

j=parent.keynum-1;

while(j>=i){

parent.key[j+1]=parent.key[j];

if(j!=i) parent.child.set(j+1, parent.child.get(j));

j--;

}

parent.key[i]=first.key[parent.minDgree-1];

parent.keynum++;

parent.child.set(i+1, second);

System.out.println("fenliehou keynum"+parent.keynum+"zhiwei"+parent.key[i]+"i wei"+i);

}

public static > BTree insert(BTree root,T ele){

if(root==null) return null;

if(root.keynum==(2*root.minDgree-1)){

BTree newRoot=new BTree();

newRoot.minDgree=root.minDgree;

newRoot.isLeaf=false;

newRoot.key=(T[])Array.newInstance(root.key.getClass().getComponentType(), Array.getLength(root.key));

Arrays.fill(newRoot.key, 0);

newRoot.keynum=0;

newRoot.child=new ArrayList(Array.getLength(root.key)+1);

for(int i=0;i<2*newRoot.minDgree;i++){

newRoot.child.add(null);

}

newRoot.child.set(0, root);

split(newRoot,0);

insertNonfull(newRoot,ele);

return newRoot;

}else{

insertNonfull(root,ele);

return root;

}

}

public static > void insertNonfull(BTree p,T ele){

T[] newArray=(T[])Arrays.copyOf(p.key, p.keynum);

int i=Arrays.binarySearch(newArray, ele);

int insertionPoint=-(i+1);

if(i<0 && !p.isLeaf){

if(p.child.get(insertionPoint).keynum==(2*p.minDgree-1)){

split(p,insertionPoint);

insertionPoint=ele.compareTo(p.key[insertionPoint])>0 ? (insertionPoint+1):insertionPoint;

}

insertNonfull(p.child.get(insertionPoint),ele);

}

if(i<0 && p.isLeaf){

int j=p.keynum-1;

while(j>=insertionPoint){

p.key[j+1]=p.key[j];

j--;

}

p.key[insertionPoint]=ele;

System.out.println("cha ru ele"+ele+"wei zhi"+insertionPoint+"jie dian"+p+"keynum"+p.keynum);

p.keynum++;

}

}

public boolean search(T k){

T[] array=Arrays.copyOf(key, keynum);

int i=Arrays.binarySearch(array, k);/*NullPointerException null不能参与比较大小 */

if(i>=0) return true;

if(isLeaf) return false;

int insertionPoint=-(i+1);

return child.get(insertionPoint).search(k);

}

public void traverse(){

int i;

for(i=0;i

if(child.get(i)!=null) child.get(i).traverse();

System.out.print(key[i]+",");

}

if(child.get(i)!=null) child.get(i).traverse();

}

public static void main(String[] args){

BTree btree=new BTree(new Integer[]{1,2,3,4,5,6,7,8,9,10,11,12,13},3);

btree.traverse();

boolean b1=btree.search(12);

boolean b2=btree.search(49);

System.out.println("\nb1 : "+b1+" b2 : "+b2);

}

}

输出结果:

cha ru ele1wei zhi0jie [email protected]

初始化第1个节点

cha ru ele2wei zhi1jie [email protected]

初始化第2个节点

cha ru ele3wei zhi2jie [email protected]

初始化第3个节点

cha ru ele4wei zhi3jie [email protected]

初始化第4个节点

cha ru ele5wei zhi4jie [email protected]

初始化第5个节点

fenliehou keynum1zhiwei3i wei0

cha ru ele6wei zhi2jie [email protected]

初始化第6个节点

cha ru ele7wei zhi3jie [email protected]

初始化第7个节点

cha ru ele8wei zhi4jie [email protected]

初始化第8个节点

fenliehou keynum2zhiwei6i wei1

cha ru ele9wei zhi2jie [email protected]

初始化第9个节点

cha ru ele10wei zhi3jie [email protected]

初始化第10个节点

cha ru ele11wei zhi4jie [email protected]

初始化第11个节点

fenliehou keynum3zhiwei9i wei2

cha ru ele12wei zhi2jie [email protected]

初始化第12个节点

cha ru ele13wei zhi3jie [email protected]

初始化第13个节点

1,2,3,4,5,6,7,8,9,10,11,12,13,

b1 : true   b2 : false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值