protected bool DeleteNode(TreeAA tree, int keyDelete)
        {
            NodeAA node = SearchNode(tree.root, keyDelete);

            if (node == null)
            {
                return(false);
            }
            else
            {
                if (node.left == null && node.right == null)
                {
                    //xoa node la
                    DeleteLeaf(tree, keyDelete);
                    while (!CheckBalance(tree.root, keyDelete))
                    {
                        Console.WriteLine("root: {0}", tree.root.data);
                    }
                    return(true);
                }
                else
                {
                    int numberTest = DeleteBough(tree, node);
                    while (!CheckBalance(tree.root, numberTest))
                    {
                        Console.WriteLine("root: {0}", tree.root.data);
                    }
                    //xoa node co 2 con
                    return(true);
                }
            }
        }
        protected void DeleteLeaf(TreeAA tree, int keyDelete)
        {
            NodeAA nodeParent = SearchParent(tree.root, keyDelete);

            if (nodeParent != null)
            {
                if (keyDelete < nodeParent.data)
                {
                    nodeParent.left = null;
                    nodeParent.level--;
                    if (nodeParent.right.level > nodeParent.level)
                    {
                        nodeParent.right.level--;
                    }
                }
                else
                {
                    nodeParent.right = null;
                    nodeParent.level = 1;
                }
            }
            else
            {
                if (tree.root.data == keyDelete)
                {
                    tree.root = null;
                }
            }
        }
        protected int DeleteBough(TreeAA tree, NodeAA node)
        {
            NodeAA leftBestChild = FindLeftBestChild(node.left);
            NodeAA parentLBC     = SearchParent(node, leftBestChild.data);

            Console.WriteLine("parent:{0}", parentLBC.data);
            node.data = leftBestChild.data;
            if (node.data == parentLBC.data)
            {
                parentLBC.left = null;
            }
            else
            {
                parentLBC.right = null;
            }
            parentLBC.level = 1;
            if (parentLBC.left != null)
            {
                parentLBC.left.level = 1;
            }
            else
            {
                parentLBC.right.level = 1;
            }
            return(parentLBC.data);
        }
 protected bool InsertTree(TreeAA tree, int newData)
 {
     return(InsertNode(tree.root, newData));
 }