code: protected void splitNodes(KDTreeNode node, double[][] universe,
        int depth) throws Exception {
      double[][] nodeRanges = m_EuclideanDistance.initializeRanges(m_InstList,
                                                   node.m_Start, node.m_End);
      if (node.numInstances() <= m_MaxInstInLeaf
          || getMaxRelativeNodeWidth(nodeRanges, universe) <= m_MinBoxRelWidth)
        return;
  
      // splitting a node so it is no longer a leaf
      m_NumLeaves--;
  
      if (depth > m_MaxDepth)
        m_MaxDepth = depth;
  
      m_Splitter.splitNode(node, m_NumNodes, nodeRanges, universe);
      m_NumNodes += 2;
      m_NumLeaves += 2;
  
      splitNodes(node.m_Left, universe, depth + 1);
      splitNodes(node.m_Right, universe, depth + 1);
    }
docs: Recursively splits nodes of a tree starting from the supplied node.
  The splitting stops for any node for which the number of instances/points
  falls below a given threshold (given by m_MaxInstInLeaf), or if the
  maximum relative width/range of the instances/points
  (i.e. max_i(max(att_i) - min(att_i)) ) falls below a given threshold
  (given by m_MinBoxRelWidth).
  
  @param node The node to start splitting from.
  @param universe The attribute ranges of the whole dataset.
  @param depth The depth of the supplied node.
  @throws Exception If there is some problem
  splitting.