public void InsertNode(int dataNode)
        {
            if (data > dataNode)
            {
                //InsertNode(root.left, dataNode);
                if (left == null)
                {
                    NodeAVL node = new NodeAVL(dataNode);
                    left = node;
                    return;
                }

                else
                {
                    left.InsertNode(dataNode);
                }
            }
            if (data < dataNode)
            {
                //InsertNode(root.right, dataNode);
                if (right == null)
                {
                    NodeAVL node = new NodeAVL(dataNode);
                    right = node;
                    return;
                }
                else
                {
                    right.InsertNode(dataNode);
                }
            }
        }
 int HeightTree(NodeAVL node)
 {
     if (node == null)
     {
         return(0);
     }
     else
     {
         return(1 + Math.Max(HeightTree(node.left), HeightTree(node.right)));
     }
 }
 public int CheckBalanceNode(NodeAVL node)
 {
     if (node == null)
     {
         return(0);
     }
     else
     {
         return(HeightTree(node.right) - HeightTree(node.left));
     }
 }
        void RightRotation(NodeAVL P, NodeAVL Q)
        {
            P.left  = Q.left;
            Q.left  = Q.right;
            Q.right = P.right;
            P.right = Q;
            int temp = P.data;

            P.data = Q.data;
            Q.data = temp;
        }
 public void InsertNode(int dataNode)
 {
     if (root == null)
     {
         NodeAVL temp = new NodeAVL(dataNode);
         root = temp;
     }
     else
     {
         root.InsertNode(dataNode);
         root.CheckBalanceInsert(root, dataNode);
     }
 }
        public void CheckBalanceInsert(NodeAVL node, int newData)
        {
            if (node != null)
            {
                if (node.data == newData)
                {
                    return;
                }
                int checkPrimary = CheckBalanceNode(node);
                int kt           = node.data;
                if (checkPrimary >= 2)
                {
                    //- mat can bang right right
                    int checkSecondary = CheckBalanceNode(node.right);
                    if (checkSecondary > 0)
                    {
                        //mat can bang RR.
                        BalanceRR(node);
                        return;
                    }
                    else
                    {
                        //mat can bang RL
                        BalanceRL(node);
                        return;
                    }
                }
                if (checkPrimary <= -2)
                {
                    int checkSecondary = CheckBalanceNode(node.left);
                    if (checkSecondary > 0)
                    {
                        //mat can bang LR
                    }
                    else
                    {
                        //mat can bang LL
                    }
                }
                //chua mat can bang

                if (newData > node.data)
                {
                    CheckBalanceInsert(node.right, newData);
                }
                else
                {
                    CheckBalanceInsert(node.left, newData);
                }
            }
        }
 public CreateAVL()
 {
     root = null;
 }
 public CreateAVL(int dataRoot)
 {
     root = new NodeAVL(dataRoot);
 }
 public NodeAVL(int dataNode)
 {
     this.data  = dataNode;
     this.left  = null;
     this.right = null;
 }
 void BalanceRL(NodeAVL P)
 {
     RightRotation(P.right, P.right.left);
     LeftRotation(P, P.right);
 }
 //-- handle imbalance
 void BalanceRR(NodeAVL P)
 {
     LeftRotation(P, P.right);
 }