private KdNode Insert(KdNode node, Point2D p, bool vertical) {
if (node == null) {
size++;
return new KdNode(p.X, p.Y, vertical);
}
if (node.X.Equals(p.X) && node.Y.Equals(p.Y)) {
return node;
}
if (node.Vertical && p.X < node.X || !node.Vertical && p.Y < node.Y) {
node.Left = Insert(node.Left, p, !node.Vertical);
}
else {
node.Right = Insert(node.Right, p, !node.Vertical);
}
return node;
}