Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }