/// <summary> /// Recursively move until last dimension and then delete if found. /// </summary> private void deleteRecursive(OneDimentionalRangeTree <T> tree, T[] value, int currentDimension, ref bool found) { var node = tree.Find(value[currentDimension]); if (node != null) { if (currentDimension + 1 == dimensions) { found = true; } else { deleteRecursive(node.tree, value, currentDimension + 1, ref found); } } //delete node if next dimension has no elements //or when this is the last dimension and we found element if (node != null && found && (currentDimension + 1 == dimensions || node.tree.Count == 0 && currentDimension + 1 < dimensions)) { tree.Delete(value[currentDimension]); } }
public RangeTree(int dimensions, IComparer <T> comparer = null) { if (dimensions <= 0) { throw new Exception("Dimension should be greater than 0."); } this.dimensions = dimensions; tree = new OneDimentionalRangeTree <T>(comparer); }
/// <summary> /// Recursively visit node and return points within given range. /// </summary> private List <T[]> rangeSearch( OneDimentionalRangeTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.RangeSearch(start[dimension], end[dimension]); if (dimension + 1 == dimensions) { var result = new List <T[]>(); foreach (var value in nodes.SelectMany(x => x.Values)) { var thisDimResult = new T[dimensions]; thisDimResult[dimension] = value; result.Add(thisDimResult); } return(result); } else { var result = new List <T[]>(); foreach (var node in nodes) { var nextDimResult = rangeSearch(node.tree, start, end, dimension + 1); foreach (var value in node.Values) { foreach (var nextResult in nextDimResult) { nextResult[dimension] = value; result.Add(nextResult); } } } return(result); } }
internal RangeTreeNode(T value) { Values = new List <T>(new T[] { value }); tree = new OneDimentionalRangeTree <T>(); }
internal RangeTreeNode(T value, IComparer <T> comparer) { Values = new List <T>(new T[] { value }); tree = new OneDimentionalRangeTree <T>(comparer); }