数据结构-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(); } }
删除还没实现待续。
相关文章推荐
- 快速排序实现
- 数据结构——树之基础知识篇
- 数据结构与算法笔记:三
- 数据结构与算法笔记:二
- 数据结构与算法笔记:1
- 基于mina的websocket初步实现
- 有n个长为m+1的字符串
- 《微软等数据结构+算法面试100题》自娱自解(完结)ZHUAN
- 数据结构学习笔记(7.栈的应用及简单的计算器)
- Dijkstra算法再学习
- 查找 -数据结构
- 关于数据结构的一个疑问
- 数据结构一(学习静态链表)
- 从B树、B+树、B*树谈到R 树
- 数据结构之查找一静态查找
- 数据结构——斐波那契堆FibonacciHeap(C语言)
- Redis学习(3)――数据结构
- 链表两节点互换的指针问题
- 数据结构基础(9)------------简单选择排序(Simple Selection Sort)
- 数据结构基础(8)------------冒泡排序(Bubble Sort)