예제 #1
0
 public void InsertRight(TreeSegment parentNode, TreeSegment newNode)
 {
     parentNode.Right = newNode;
     newNode.Parent   = parentNode;
     newNode.Color    = Red;
     parentNode.UpdateAugmentedData();
     FixTreeOnInsert(newNode);
     Count++;
 }
예제 #2
0
            void RotateRight(TreeSegment node)
            {
                TreeSegment left = node.Left;

                Replace(node, left);
                node.Left = left.Right;
                if (node.Left != null)
                {
                    node.Left.Parent = node;
                }
                left.Right  = node;
                node.Parent = left;
                node.UpdateAugmentedData();
                node.Parent.UpdateAugmentedData();
            }
예제 #3
0
            void RotateLeft(TreeSegment node)
            {
                TreeSegment right = node.Right;

                Replace(node, right);
                node.Right = right.Left;
                if (node.Right != null)
                {
                    node.Right.Parent = node;
                }
                right.Left  = node;
                node.Parent = right;
                node.UpdateAugmentedData();
                node.Parent.UpdateAugmentedData();
            }
예제 #4
0
        internal void UpdateAugmentedData()
        {
            int totalLength      = DistanceToPrevNode;
            int distanceToMaxEnd = Length;

            var left = Left;

            if (left != null)
            {
                totalLength += left.TotalLength;
                int leftdistance = left.DistanceToMaxEnd - DistanceToPrevNode;
                var leftRight    = left.Right;
                if (leftRight != null)
                {
                    leftdistance -= leftRight.TotalLength;
                }
                if (leftdistance > distanceToMaxEnd)
                {
                    distanceToMaxEnd = leftdistance;
                }
            }

            var right = Right;

            if (right != null)
            {
                totalLength += right.TotalLength;
                int rightdistance = right.DistanceToMaxEnd + right.DistanceToPrevNode;
                var rightLeft     = right.Left;
                if (rightLeft != null)
                {
                    rightdistance += rightLeft.TotalLength;
                }
                if (rightdistance > distanceToMaxEnd)
                {
                    distanceToMaxEnd = rightdistance;
                }
            }

            if (TotalLength != totalLength || DistanceToMaxEnd != distanceToMaxEnd)
            {
                TotalLength      = totalLength;
                DistanceToMaxEnd = distanceToMaxEnd;
                Parent?.UpdateAugmentedData();
            }
        }