public static void Join(Event e1, Event e2) { if (!e1.IsLeaf && !e2.IsLeaf && e1.Value > e2.Value) { Join(e2, e1); e1.Copy(e2); e1.Normalize(); return; } if (!e1.IsLeaf && !e2.IsLeaf && e1.Value <= e2.Value) { var d = e2.Value - e1.Value; e2.Left.Lift(d); e2.Right.Lift(d); Join(e1.Left, e2.Left); Join(e1.Right, e2.Right); e1.Normalize(); return; } if (e1.IsLeaf && !e2.IsLeaf) { e1.SetAsNode(); Join(e1, e2); e1.Normalize(); return; } if (!e1.IsLeaf && e2.IsLeaf) { e2.SetAsNode(); Join(e1, e2); e1.Normalize(); return; } if (e1.IsLeaf && e2.IsLeaf) { e1.Value = GetMaxValue(e1, e2); e1.Normalize(); return; } throw new EventOperationException("Event Join failed", e1, e2); }