public static void SplitBySize(Treap <T> current, int toCut, out Treap <T> leftHalf, out Treap <T> rightHalf) { if (current == null) { leftHalf = null; rightHalf = null; } else if (GetSize(current.Left) >= toCut) { SplitBySize(current.Left, toCut, out leftHalf, out rightHalf); current.Left = rightHalf; current.update(); rightHalf = current; } else { SplitBySize(current.Right, toCut - GetSize(current.Left) - 1, out leftHalf, out rightHalf); current.Right = leftHalf; current.update(); leftHalf = current; } }
public static Treap <T> Merge(Treap <T> leftTreap, Treap <T> rightTreap) { if (leftTreap == null) { return(rightTreap); } if (rightTreap == null) { return(leftTreap); } if (randomGenerator.Next(0, leftTreap.Size + rightTreap.Size) < leftTreap.Size) { leftTreap.Right = Merge(leftTreap.Right, rightTreap); leftTreap.update(); return(leftTreap); } else { rightTreap.Left = Merge(leftTreap, rightTreap.Left); rightTreap.update(); return(rightTreap); } }