您的位置:首页 > 理论基础 > 数据结构算法

数据结构-B树实现

2014-03-22 20:04 302 查看
B树实现。

package com.data.struct;

public class BTree {
private Node root;
private int degree;

public BTree(int degree,int [] data){
this.degree=degree;
//create();
for(int i=0;i<data.length;i++){
insert(data[i]);
}
}

private void create(){
Node node=new Node();
node.leaf=true;
root=node;
}

public void insert(int key){
if(root==null){
Node node=new Node();
node.leaf=true;
node.key[0]=key;
node.n=1;
root=node;
return;
}
Node r=root;
if(r.n==2*degree-1){
Node s=new Node();
root=s;
s.leaf=false;
s.n=0;
s.child[0]=r;
r.parent=s;
splitChild(s,0);
insertNotFull(s,key);
}else{
insertNotFull(r,key);
}
}

public void printTree(){
System.out.print("      ");
for(int i=0;i<root.n;i++){
System.out.print(root.key[i]);
}
innerPreorderWalk(root,1);
System.out.println();
}

private void innerPreorderWalk(Node node,int depth){
if(node!=null){
for(int i=6-depth*2;i>0;i--){
System.out.print(" ");
}
for(int i=0;i<node.n;i++){
System.out.print(node.key[i]);
}
System.out.print("-");
if(node!=root){
for(int i=0;i<node.parent.n;i++){
System.out.print(node.parent.key[i]);
}
}
System.out.println();
for(int i=0;i<node.n+1;i++){
innerPreorderWalk(node.child[i],depth+1);
}

}

}

private void splitChild(Node node,int i){
Node z=new Node();
z.parent=node;
Node y=node.child[i];
z.leaf=y.leaf;
z.n=degree-1;
for(int j=0;j<degree-1;j++){
z.key[j]=y.key[j+degree];
}
if(!y.leaf){
for(int j=0;j<degree;j++){
z.child[j]=y.child[j+degree];
y.child[j+degree].parent=z;
}
}
y.n=degree-1;
for(int j=node.n;j>=i+1;j--){
node.child[j+1]=node.child[j];
}
node.child[i+1]=z;
for(int j=node.n-1;j>=i;j--){
node.key[j+1]=node.key[j];
}
node.key[i]=y.key[degree-1];
node.n=node.n+1;
}
private void insertNotFull(Node node,int key){
int i=node.n-1;
if(node.leaf){
while(i>=0&&key<node.key[i]){
node.key[i+1]=node.key[i];
i=i-1;
}
node.key[i+1]=key;
node.n+=1;
}else{
while(i>=0&&key<node.key[i]){
i=i-1;
}
i=i+1;
Node child=node.child[i];
if(child.n==2*degree-1){
splitChild(node,i);
if(key>node.key[i]){
i=i+1;
}
}
insertNotFull(node.child[i],key);
}
}

public SearchResult search(int key){
return innerSearch(root,key);
}
private SearchResult innerSearch(Node node,int key){
int i=0;
while(i<degree*2-1 && key>node.key[i]){
i=i+1;
}
if(i<degree*2-1 && key==node.key[i]){
SearchResult result=new SearchResult();
result.setIndex(i);
result.setNode(node);
return result;
}else if(node.leaf){
return null;
}else{
return innerSearch(node.child[i],key);
}
}

public class SearchResult{
private Node node;
private int index;
public Node getNode() {
return node;
}
public void setNode(Node node) {
this.node = node;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}

}

public  class Node{
private Node parent;
private Node []child=new Node[2*degree];
private int [] key=new int[2*degree-1];
private boolean leaf;
private int n;
public boolean isLeaf() {
return leaf;
}
public void setLeaf(boolean leaf) {
this.leaf = leaf;
}

public void addChild(int index,Node node)throws Exception{
if(child[index]!=null){
throw new Exception("child is not null");
}
child[index]=node;
node.parent=this;
this.leaf=false;
n=n+1;
if(n>2*degree-1){
throw new Exception("n exceeded");
}
}
public void adKey(int index ,int k)throws Exception{
if(key[index]!=-1){
throw new Exception("key is not empty");
}
key[index]=k;
}

}

public static void main(String[] args) {
int [] data=new int[]{1,2,3,4,5,6,7,8,9};
BTree btree=new BTree(2,data);
System.out.println();
btree.printTree();
int [] data2=new int[]{9,8,7,6,5,4,3,2,1};
BTree btree2=new BTree(2,data2);
System.out.println();
btree2.printTree();
int [] data3=new int[]{1,8,3,9,4,6,5,2,7};
BTree btree3=new BTree(2,data3);
System.out.println();
btree3.printTree();
}

}


删除还没实现待续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: