docs: public void add(DATA data) {
  		if(root == null) {
  			root = new RootLeafNode(data);
  			try {
  				root.addData(data, 0);
  			} catch (SplitNodeReplacement e) {
  				throw new RuntimeException("Should never happen!");
  			}
  		} else {
  			double distance = distanceFunction.calculate(data, root.data);
  			try {
  				root.addData(data, distance);
  			} catch(SplitNodeReplacement e) {
  				Node newRoot = new RootNode(data);
  				root = newRoot;
  				for(int i = 0; i < e.newNodes.length; i++) {
  					@SuppressWarnings("unchecked")
  					Node newNode = (Node) e.newNodes[i];
  					distance = distanceFunction.calculate(root.data, newNode.data);
  					root.addChild(newNode, distance);
  				}
  			}
  		}
  	}