private ITNodeInt ConstructRecursive(List <ITIntervalInt> L) { if (L.Count <= 0) { return(null); } ITNodeInt n = new ITNodeInt(); n.mid = Median(L); List <ITIntervalInt> left = new List <ITIntervalInt>(); List <ITIntervalInt> right = new List <ITIntervalInt>(); foreach (ITIntervalInt i in L) { if (i.max < n.mid) { left.Add(i); } else if (i.min > n.mid) { right.Add(i); } else { n.left.Add(i); n.right.Add(i); } } n.left.Sort((a, b) => { return(a.min.CompareTo(b.min)); }); n.right.Sort((a, b) => { return(b.max.CompareTo(a.max)); }); n.lc = ConstructRecursive(left); n.rc = ConstructRecursive(right); return(n); }
private void FindRecursive(ITNodeInt n, int val, ref List <object> res) { if (n == null) { return; } if (val <= n.mid) { foreach (ITIntervalInt i in n.left) { if (i.min > val) { break; } if (i.max > val || i.min == i.max) { res.Add(i.obj); } } FindRecursive(n.lc, val, ref res); } else { foreach (ITIntervalInt i in n.right) { if (i.max < val) { break; } res.Add(i.obj); } FindRecursive(n.rc, val, ref res); } }
private void FindRecursive(ITNodeInt n, int val1, int val2, ref List <object> res, Func <object, bool> filter) { if (n == null) { return; } if (val2 <= n.mid) { foreach (ITIntervalInt i in n.left) { if (i.min > val2) { break; } if (filter == null || filter(i.obj)) { res.Add(i.obj); } } FindRecursive(n.lc, val1, val2, ref res, filter); } else if (val1 >= n.mid) { foreach (ITIntervalInt i in n.right) { if (i.max < val1) { break; } if (filter == null || filter(i.obj)) { res.Add(i.obj); } } FindRecursive(n.rc, val1, val2, ref res, filter); } else { foreach (ITIntervalInt i in n.left) { if (i.min > val2) { break; } if (filter == null || filter(i.obj)) { res.Add(i.obj); } } FindRecursive(n.lc, val1, n.mid, ref res, filter); FindRecursive(n.rc, n.mid, val2, ref res, filter); } }
void Construct() { intervals.Sort((a, b) => { return(a.mid.CompareTo(b.mid)); }); root = ConstructRecursive(intervals); }
public void Clear() { intervals.Clear(); objects.Clear(); root = null; }
public void Add(object obj, int min, int max) { intervals.Add(new ITIntervalInt(obj, min, max)); objects.Add(obj); root = null; }