import java.util.*; public class MNode> { private MTree tree; private MNode parent; private MNode right; private ArrayList > data; private int m; //capacity of the MNode public MNode(int m,MTree tree){ this.tree = tree; parent = null; right = null; this.m = m; data = new ArrayList>(m+1); // one extra for overflow } public int getM(){return m;} public int size(){return data.size();} public ArrayList> getData(){return data;} public Pair getData(int i){return data.get(i);} public MNode getParent(){return parent;} private void setParent(MNode parent){this.parent = parent;} public MNode getRight(){return right;} private void setRight(MNode right){this.right = right;} private MNode find(E e){ if (isLeaf()) {System.out.println("found: "+ this); return this;} MNode node = null; for (int i=0;i p = new Pair(e,null); if (size() == 0) data.add(p); else find(e).add(p); } private void add(Pair p){ System.out.print("add("+ p +") + "); for (Pair x : data) System.out.print(x + " "); System.out.print(" -> "); int k = 0; // insertion point while(k < size() && data.get(k).getValue().compareTo(p.getValue())<0) k++; if (k < size()) data.add(k,p); else data.add(p); for (Pair x : data) System.out.print(x + " "); System.out.println(); if (size() == m) split(); } private void add(Pair p,MNode node){ System.out.print("add("+ p +") + "); for (Pair x : data) System.out.print(x + " "); System.out.print(" -> "); int k = 0; // insertion point while(k < size() && data.get(k).getValue().compareTo(p.getValue())<0) k++; if (k < size()) {data.add(k,p);data.get(k+1).setLeft(node);} else {data.add(p); right = node;} for (Pair x : data) System.out.print(x + " "); System.out.println(); if (size() == m) split(); } private void split() { System.out.println("Split: "+ this); MNode u = parent; if (u == null){u = new MNode(m,tree); tree.setRoot(u);} MNode v = this; MNode w = new MNode(m,tree); // create a new node w Pair p1 = data.get(m-2); // get second last element Pair p2 = data.get(m-1); // get last pair in data w.add(p2); // overflow last pair into new node; w.setRight(v.getRight()); w.setParent(u); // w's parent is u v.getData().remove(m-1); // remove overflow element from v (this) v.getData().remove(m-2); // remove second last element from v (this) v.setRight(p1.getLeft()); // p1 is now removed p1.setLeft(v); u.add(p1,w); } public boolean isLeaf(){return data.get(0).getLeft() == null;} public String toString(){ String s = "("; for (Pair p : data){ if (p.getLeft() != null)s = s + p.getLeft(); s = s + p.getValue() + ","; } if (right != null) s = s + right; s = s + ")"; return s; } }