private RTreeNode chooseLeaf(T o, RTreeNode n)
	{
		assert(n != null);
		if (n.isLeaf())
		{
			return n;
		}
		else
		{
			final BoundedCube box = o.getBounds();

			int maxOverlap = Integer.MAX_VALUE;
			RTreeNode maxnode = null;
			for (int i = 0; i < n.children.size(); i++)
			{
				final int overlap = expansionNeeded(n.children.get(i).box, box);
				if ((overlap < maxOverlap) || (overlap == maxOverlap)
						&& ((maxnode!=null)&&(area(n.children.get(i).box) < area(maxnode.box))))
						{
					maxOverlap = overlap;
					maxnode = n.children.get(i);
				}
			}

			if (maxnode == null) // Not sure how this could occur
				return null;

			return chooseLeaf(o, maxnode);
		}
	}