public Node DeleteNode(Node node, int data)
        {
            Node tempNode = node;

            if (node.nodeValue == data)
            {
                if (node.leftNode == null)
                {
                    node = tempNode.rigntNode;
                }
                else if (node.rigntNode == null)
                {
                    node = tempNode.leftNode;
                }
                else
                {
                    Node minValueNode = node.rigntNode;
                    int  minv         = minValueNode.nodeValue;
                    while (minValueNode.leftNode != null)
                    {
                        minv         = minValueNode.leftNode.nodeValue;
                        minValueNode = minValueNode.leftNode;
                    }
                    node.nodeValue = minv;
                    node.rigntNode = DeleteNode(node.rigntNode, minv);
                }
            }
            else
            {
                if (data > node.nodeValue)
                {
                    node.rigntNode = DeleteNode(node.rigntNode, data);
                }
                else
                {
                    node.leftNode = DeleteNode(node.leftNode, data);
                }
            }
            if (node != null)
            {
                node = node.Getheight(node);
                int balanceFactor = node.GetBalanceFactor(node);

                if (balanceFactor > 1)
                {
                    if (node.nodeValue < node.leftNode.nodeValue)
                    {
                        node = node.LeftBalanceing(node);
                    }
                    else
                    {
                        node = node.LeftRightBalancing(node);
                    }
                }
                else if (balanceFactor < -1)
                {
                    if (node.nodeValue > node.rigntNode.nodeValue)
                    {
                        node = node.RightBalanceing(node);
                    }
                    else
                    {
                        node = node.RightLeftBalancing(node);
                    }
                }
            }
            return(node);
        }
        public Node InsertNode(Node node, int data)
        {
            if (node.nodeValue == 0)
            {
                node.nodeValue = data;
                node.height    = 1;
            }
            else if (data < node.nodeValue)
            {
                if (node.leftNode == null)
                {
                    node.leftNode           = new Node();
                    node.leftNode.nodeValue = data;
                    node.leftNode.height    = 1;
                }
                else
                {
                    node.leftNode = InsertNode(node.leftNode, data);
                }
            }
            else
            {
                if (node.rigntNode == null)
                {
                    node.rigntNode           = new Node();
                    node.rigntNode.nodeValue = data;
                    node.rigntNode.height    = 1;
                }
                else
                {
                    node.rigntNode = InsertNode(node.rigntNode, data);
                }
            }
            //Calculate left and right height of each node
            node = node.Getheight(node);
            //Calculate Is balancing needed of each node
            int balanceFactor = node.GetBalanceFactor(node);

            if (balanceFactor > 1)
            {
                if (data < node.leftNode.nodeValue)
                {
                    node = node.LeftBalanceing(node);
                }
                else
                {
                    node = node.LeftRightBalancing(node);
                }
            }
            else if (balanceFactor < -1)
            {
                if (data > node.rigntNode.nodeValue)
                {
                    node = node.RightBalanceing(node);
                }
                else
                {
                    node = node.RightLeftBalancing(node);
                }
            }
            return(node);
        }