//For dummy node only
 public KDTreeNode(int dim, KDTreeNode child)
 {
     isLeaf    = false;
     leftChild = child;
     splitDim  = 0;
     point     = new Point(dim, 1000);
 }
 public KDTreeNode(PointSet ps, KDTreeNode parent, DimWeight dwsplit, bool useRandom)
 {
     this.parent = parent;
     if (ps.Points.Count() > 1)
     {
         isLeaf = false;
         if (useRandom)
         {
             splitDim = dwsplit.getRandomDim();
         }
         else
         {
             splitDim = ps.GetLongestDimension(dwsplit);
         }
         var pss = ps.PartitionMedian(splitDim);
         point      = pss.median;
         leftChild  = new KDTreeNode(pss.lower, this, dwsplit, useRandom);
         rightChild = new KDTreeNode(pss.upper, this, dwsplit, useRandom);
     }
     else if (ps.Points.Count() == 1)
     {
         isLeaf = true;
         point  = ps.Points[0];
     }
     else
     {
         isLeaf = true;
     }
 }
 public KDTree(PointSet ps, DimWeight dw, bool useRandom)
 {
     splitWeight = dw;
     root        = new KDTreeNode(ps, null, splitWeight, useRandom);
     root.parent = new KDTreeNode(ps.NumDim, root);
     root        = root.parent;
 }