/// <summary>
        /// Fix the root balance if LTDict and GTDict have good balance
        /// Used to keep the depth less than 1.44 log_2 N (AVL tree)
        /// </summary>
        AvlNode <T> FixRootBalance()
        {
            int bal = Balance;

            if (Math.Abs(bal) < 2)
            {
                return(this);
            }

            if (bal == 2)
            {
                if (_left.Balance == 1 || _left.Balance == 0)
                {
                    //Easy case:
                    return(this.RotateToGT());
                }
                if (_left.Balance == -1)
                {
                    //Rotate LTDict:
                    var newLt   = _left.RotateToLT();
                    var newRoot = NewOrMutate(Value, newLt, _right);
                    return(newRoot.RotateToGT());
                }
                throw new Exception($"LTDict too unbalanced: {_left.Balance}");
            }
            if (bal == -2)
            {
                if (_right.Balance == -1 || _right.Balance == 0)
                {
                    //Easy case:
                    return(this.RotateToLT());
                }
                if (_right.Balance == 1)
                {
                    //Rotate GTDict:
                    var newGt   = _right.RotateToGT();
                    var newRoot = NewOrMutate(Value, _left, newGt);
                    return(newRoot.RotateToLT());
                }
                throw new Exception($"LTDict too unbalanced: {_left.Balance}");
            }
            //In this case we can show: |bal| > 2
            //if( Math.Abs(bal) > 2 ) {
            throw new Exception($"Tree too out of balance: {Balance}");
        }