public void InsertRight(TreeSegment parentNode, TreeSegment newNode) { parentNode.Right = newNode; newNode.Parent = parentNode; newNode.Color = Red; parentNode.UpdateAugmentedData(); FixTreeOnInsert(newNode); Count++; }
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(); }
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(); }
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(); } }