KdNode InsertHelper(KdNode root, int[] values, int dim) { if (root == null) { return(new KdNode(values)); } int index = dim % K; if (root.IsLess(values, index)) { root.mRight = InsertHelper(root.mRight, values, dim + 1); } else { root.mLeft = InsertHelper(root.mLeft, values, dim + 1); } return(root); }
KdNode DeleteHelper(KdNode root, int[] values, int dim) { if (root == null) { return(null); } int index = dim % K; if (root.IsSame(values)) { if (root.mRight != null) { KdNode minNode = FindMinHelper(root.mRight, index, dim + 1); root.SetValues(minNode.mValues); root.mRight = DeleteHelper(root.mRight, minNode.mValues, dim + 1); } else if (root.mLeft != null) { KdNode minNode = FindMinHelper(root.mLeft, index, dim + 1); root.SetValues(minNode.mValues); root.mRight = DeleteHelper(root.mLeft, minNode.mValues, dim + 1); root.mLeft = null; } else //left node, direct delete { return(null); } } else if (root.IsLess(values, index)) { root.mRight = DeleteHelper(root.mRight, values, dim + 1); } else { root.mLeft = DeleteHelper(root.mLeft, values, dim + 1); } return(root); }
KdNode FindHelper(KdNode root, int[] values, int dim) { if (root == null) { return(null); } if (root.IsSame(values)) { return(root); } int index = dim % K; if (root.IsLess(values, index)) { return(FindHelper(root.mRight, values, dim + 1)); } else { return(FindHelper(root.mLeft, values, dim + 1)); } }