Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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 ();
        }