public void TestAddNode1() { var tree = new IntervalTree (0, 100); bool added = tree.Add (0, 10); Assert.True (added); Assert.True (tree.Children.Count == 1); var child = tree.Children[0]; Assert.True (child.Start == 0); Assert.True (child.End == 10); added = tree.Add (9, 15); Assert.True (!added); added = tree.Add (60, 65); Assert.True (added); child = tree.Children[1]; Assert.True (child.Start == 60); Assert.True (child.End == 65); added = tree.Add (20, 60); Assert.True (added); Assert.True (tree.Children.Count == 3); child = tree.Children[1]; Assert.True (child.Start == 20); Assert.True (child.End == 60); }
/// <summary> /// Creates an array of trees from start and end brackets. /// Uses similar algorithm to Boolean operations on groups. /// Searches for minimum value and advances the one least one. /// </summary> /// <returns>Returns an array of trees.</returns> /// <param name="start">Start brackets.</param> /// <param name="end">End brackets.</param> public static IntervalTree[] Nested(int[] start, int[] end) { var list = new List<IntervalTree>(); var st = new Stack<int>(); // Use a queue to get the child nodes in correct order. var childStack = new Queue<IntervalTree>(); int i = 0; int j = 0; int a, b; while (i < start.Length || j < end.Length) { a = i < start.Length ? start[i] : int.MaxValue; b = j < end.Length ? end[j] : int.MaxValue; int min = a < b ? a : b; if (min == a) { st.Push (a); i++; } if (min == b) { var node = new IntervalTree (st.Pop(), b); j++; if (st.Count > 0) { childStack.Enqueue (node); continue; } while (childStack.Count > 0 && childStack.Peek ().Start > node.Start) { node.Children.Add (childStack.Dequeue ()); } list.Add (node); } } return list.ToArray (); }