예제 #1
0
        public void Add(TreeSegment node)
        {
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }
            if (node.segmentTree != null)
            {
                throw new InvalidOperationException("Node already attached.");
            }

            node.segmentTree = this;


            int insertionOffset = node.Offset;

            node.DistanceToMaxEnd = node.Length;

            if (tree.Root == null)
            {
                tree.Count       = 1;
                tree.Root        = (T)node;
                node.TotalLength = node.DistanceToPrevNode;
                return;
            }

            if (insertionOffset < tree.Root.TotalLength)
            {
                var n = SearchNode(ref insertionOffset);
                node.TotalLength      = node.DistanceToPrevNode = insertionOffset;
                n.DistanceToPrevNode -= insertionOffset;
                tree.InsertBefore(n, node);
                return;
            }

            node.DistanceToPrevNode = node.TotalLength = insertionOffset - tree.Root.TotalLength;
            tree.InsertRight(tree.Root.GetOuterRight(), node);
        }
예제 #2
0
 public Interval(TreeSegment node, int start, int end)
 {
     this.node  = node;
     this.start = start;
     this.end   = end;
 }