/// <summary> /// Rotates tree to the left whenever levels are mismatched. /// </summary> /// <param name="t"></param> /// <param name="parent"></param> /// <param name="a_Side"></param> /// <returns>the new root node.</returns> private Node Split(Node t, Node parent, TraversalHistory.ECHILDSIDE a_Side) { if (t.Right == m_Bottom || t.Right.Right.Level != t.Level) { return(t); } // Rotate left. Node oldRight = t.Right; Node newRight = oldRight.Left; t.Right = newRight; oldRight.Left = t; if (a_Side == TraversalHistory.ECHILDSIDE.LEFT) { parent.Left = oldRight; } else if (a_Side == TraversalHistory.ECHILDSIDE.RIGHT) { parent.Right = oldRight; } else { m_Root = oldRight; } ++oldRight.Level; return(oldRight); }
/// <summary> /// Rotates tree to the right whenever levels are mismatched. /// </summary> /// <param name="t"></param> /// <param name="parent"></param> /// <param name="a_Side"></param> /// <returns></returns> private Node Skew(Node t, Node parent, TraversalHistory.ECHILDSIDE a_Side) { if (t.Left.Level != t.Level) { return(t); } // Rotate right. Node oldLeft = t.Left; Node newLeft = oldLeft.Right; t.Left = newLeft; oldLeft.Right = t; if (a_Side == TraversalHistory.ECHILDSIDE.LEFT) { parent.Left = oldLeft; } else if (a_Side == TraversalHistory.ECHILDSIDE.RIGHT) { parent.Right = oldLeft; } else { m_Root = oldLeft; } return(oldLeft); }