1. package ads1ss10.pa1;
  2.  
  3. import java.util.ListIterator;
  4.  
  5. /**
  6.  * B-Baum-Klasse die die fehlende Methode aus {@link AbstractBTree}
  7.  * implementiert.
  8.  *
  9.  * <p>
  10.  * In dieser Klasse m&uuml;ssen Sie Ihren Code einf&uuml;gen und die Method
  11.  * {@link #insert insert()} implementieren.
  12.  * </p>
  13.  *
  14.  * <p>
  15.  * Sie k&ouml;nnen beliebige neue Variablen und Methoden in dieser Klasse
  16.  * hinzuf&uuml;gen. Wichtig ist nur, dass die oben genannten Methoden
  17.  * implementiert werden.
  18.  * </p>
  19.  */
  20. public class BTree extends AbstractBTree {
  21.  
  22. /**
  23. * Hier ist die richtige Stelle f&uuml;r Initialisierungen die Sie f&uuml;r
  24. * Ihre Implementierung ben&ouml;tigen.
  25. *
  26. * @param order
  27. * Ordnung des B-Baumes.
  28. */
  29. public BTree(int order) {
  30. super(order);
  31. Helper.println("BTree order: " + order);
  32. }
  33.  
  34. /*
  35. * (non-Javadoc)
  36. *
  37. * @see ads1ss10.pa1.AbstractBTree#insert(int)
  38. */
  39. @Override
  40. public void insert(int value) {
  41. Helper.println("insert: " + value);
  42.  
  43. if(this.root == null) {
  44. this.root = new BNode(null);
  45. this.root.key.add(value);
  46. this.root.child.add(null);
  47. this.root.child.add(null);
  48. } else {
  49. insert_search(this.root, value);
  50. }
  51. }
  52. public void insert_search(BNode node, int value) {
  53. if(node.child.getFirst() != null) {
  54. ListIterator<Integer> ikey = node.key.listIterator();
  55. ListIterator<BNode> ichild = node.child.listIterator();
  56. int key = 0;
  57. for(int i=0; i < node.key.size(); i++) {
  58. key = ikey.next();
  59. BNode child = ichild.next();
  60. if(value < key) {
  61. insert_search(child,value);
  62. break;
  63. }
  64. }
  65. if(node.key.getLast() < value) {
  66. insert_search(node.child.getLast(),value);
  67. }
  68. } else {
  69. ListIterator<Integer> ikey = node.key.listIterator();
  70. int key = 0;
  71. for(int i=0; i < node.key.size(); i++) {
  72. key = ikey.next();
  73.  
  74. if(value < key) {
  75. node.key.add(i,value);
  76. node.child.add(null);
  77. break;
  78. }
  79. }
  80. if(node.key.getLast() < value) {
  81. node.key.add(node.key.size(),value);
  82. node.child.add(null);
  83. }
  84. if((this.order-1) < node.key.size()) {
  85. insert_split(node);
  86. }
  87. }
  88. }
  89. public void insert_split(BNode node) {
  90. int midindex = (int)(Math.floor(node.key.size()/2));
  91. int midvalue = node.key.get(midindex);
  92. if(node.parent == null) {
  93. BNode newRoot = new BNode(null);
  94. node.parent = newRoot;
  95. newRoot.child.add(node);
  96. this.root = newRoot;
  97. newRoot.key.add(midvalue);
  98. } else {
  99. ListIterator<Integer> ikey = node.parent.key.listIterator();
  100. int key = 0;
  101. for(int i=0; i < node.parent.key.size(); i++) {
  102. key = ikey.next();
  103.  
  104. if(midvalue < key) {
  105. node.parent.key.add(i,midvalue);
  106. break;
  107. }
  108. }
  109. if(node.parent.key.getLast() < midvalue) {
  110. node.parent.key.add(node.parent.key.size(),midvalue);
  111. }
  112. }
  113. node.key.remove(midindex);
  114. BNode leftNode = new BNode(null);
  115. for(int i=0; i < midindex; i++) {
  116. leftNode.key.add( node.key.getFirst() );
  117. leftNode.child.add( node.child.getFirst() );
  118. node.key.removeFirst();
  119. node.child.removeFirst();
  120. }
  121. leftNode.child.add( node.child.getFirst() );
  122. node.child.removeFirst();
  123. node.parent.child.add(node.parent.key.indexOf(midvalue),leftNode);
  124. leftNode.parent = node.parent;
  125. if((this.order-1) < node.parent.key.size()) {
  126. insert_split(node.parent);
  127. }
  128. }
  129.  
  130. /*
  131. * (non-Javadoc)
  132. *
  133. * Diese Methode dient nur als Beispiel und kann entfernt werden, wenn sie
  134. * nicht benoetigt wird!
  135. *
  136. * @see ads1ss10.pa1.AbstractBTree#traverseTree(ads1ss10.pa1.BNode,
  137. * ads1ss10.pa1.BNode, int, int, boolean)
  138. */
  139. @Override
  140. public void traverseTree(BNode node, BNode parent, int child_index,
  141. int depth, boolean end) {
  142.  
  143. if (node == null) {
  144. return;
  145. }
  146.  
  147. for (ListIterator<BNode> child_iterator = node.child.listIterator(); child_iterator
  148. .hasNext();) {
  149. BNode child = child_iterator.next();
  150. traverseTree(child, node, node.child.indexOf(child), depth + 1, end);
  151. }
  152. }
  153. }
  154.