public virtual bool Insert(int elem)
        {
            if (this.Search(elem))
            {
                return(false);
            }

            TreeElement add = new TreeElement(elem);

            if (RootElement == null)
            {
                this.RootElement = add;
            }
            else if (elem < current.Value)
            {
                current.ChildLeft = add;
            }
            else
            {
                current.ChildRight = add;
            }

            return(true);
        }
        protected void RotateLeft(TreeElement rotateUp)
        {
            /*  grandParent              grandParent
             *      /|\                     /|\
             *   rotateDown     -->       rotateUp
             *           \                /
             *        rotateUp       rotateDown
             *        /                       \
             *       a                         a
             */

            TreeElement rotateDown = rotateUp.Parent;

            TreeElement grandParent = rotateDown.Parent;

            ParentNodeRelation parentRelation = rotateDown.ParentRelation;

            //Die eigentliche Rotation. Nur diese zwei Zeilen sind verschieden zur anderen Rotationsrichtung
            rotateDown.ChildRight = rotateUp.ChildLeft;

            rotateUp.ChildLeft = rotateDown;

            //Neue Wurzel des Teilbaumes wieder passend an den Elternknoten hängen bzw. als RootElement setzen
            if (parentRelation == ParentNodeRelation.LeftChild)
            {
                grandParent.ChildLeft = rotateUp;
            }
            else if (parentRelation == ParentNodeRelation.RightChild)
            {
                grandParent.ChildRight = rotateUp;
            }
            else if (parentRelation == ParentNodeRelation.Root)
            {
                this.RootElement = rotateUp;
            }
        }