public boolean add(Integer val) { if (contains(val)) return false; int newLevel = 0; while (Math.random() < PROBABILITY) newLevel++; while (newLevel > maxLevel) { maxLevel++; Node newNode = new Node(null); newNode.right = new Node(null); newNode.down = head; head = newNode; } head = add(head, val, maxLevel, newLevel); return true; }
private Node add(Node curr, Integer val, int currentLevel, int wantedLevel) { Node start = curr; while (curr.right.val != null && curr.right.val < val) curr = curr.right; if (currentLevel <= wantedLevel) { Node newNode = new Node(val); newNode.right = curr.right; curr.right = newNode; } if (currentLevel != 0) { curr.down = add(curr.down, val, currentLevel - 1, wantedLevel); if (currentLevel <= wantedLevel) curr.right.down = find(curr.down, val); } return start; }
public static String format(Node node) { Map<String, Object> map = new HashMap<String, Object>(); map.put("type", node.type()); map.put("label", node.label()); if (node.factory().contains(GraphFactory.Family.directed)) { map.put("links:in", node.links(Link.Direction.in)); map.put("links:out", node.links(Link.Direction.out)); } else { map.put("links", node.links()); } if (node.factory().contains(GraphFactory.Family.fractal)) { map.put("up", node.up()); map.put("down", node.down()); } return format(map); }