/// <summary> /// recursively visit node and return points within given range /// </summary> /// <param name="currentTree"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="dimension"></param> /// <returns></returns> private List <T[]> getInRange( RangeTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.GetInRange(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 = getInRange(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); } }
/// <summary> /// recursively visit node and return points within given range /// </summary> /// <param name="currentTree"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="dimension"></param> /// <returns></returns> private List <T[]> GetInRange( RangeTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.GetInRange(start[dimension], end[dimension]); if (dimension + 1 == dimensions) { var result = new List <T[]>(); foreach (var node in nodes) { var thisDimResult = new T[dimensions]; thisDimResult[dimension] = node.Data; result.Add(thisDimResult); } return(result); } else { var result = new List <T[]>(); foreach (var node in nodes) { var nextDimResult = GetInRange(node.tree, start, end, dimension + 1); foreach (var nextResult in nextDimResult) { nextResult[dimension] = node.Data; result.Add(nextResult); } } return(result); } }
/// <summary> /// recursively move until last dimension and then delete if found /// </summary> /// <param name="tree"></param> /// <param name="value"></param> /// <param name="currentDimension"></param> /// <param name="found"></param> private void DeleteRecursive(RangeTree <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 RangeTreeNode(T value) { Data = value; tree = new RangeTree <T>(); }
public RangeTreeNode(T value) { Values = new List <T>(new T[] { value }); tree = new RangeTree <T>(); }