private static void prefixInfixToTree()
        {
            String prefix = "ABCDEFGH";
            string infix  = "BDCAFEHG";
            BNode  tree   = prefixInfixToTreeHelper(prefix, infix, 0, prefix.Length - 1, 0, infix.Length - 1);

            TreePrinter.Print(tree);
        }
        private static void binaryTreetodll()
        {
            BNode root = new BNode();

            root.data = 5;
            BNode a = new BNode();

            a.data = 4;
            BNode b = new BNode();

            b.data = 8;
            BNode c = new BNode();

            c.data = 11;
            BNode d = new BNode();

            d.data = 13;
            BNode e = new BNode();

            e.data = 4;
            BNode f = new BNode();

            f.data = 7;
            BNode g = new BNode();

            g.data = 2;
            BNode h = new BNode();

            h.data = 5;
            BNode i = new BNode();

            i.data = 1;

            root.left  = a;
            root.right = b;
            a.left     = c;
            b.left     = d;
            b.right    = e;
            c.left     = f;
            c.right    = g;
            e.left     = h;
            e.right    = i;
            TreePrinter.Print(root);
            btol bto = treetodllHelper(root);
            var  cur = bto.head;

            while (cur != null)
            {
                Console.WriteLine(cur.data);
                cur = cur.right;
            }
            //TreePrinter.Print(bto.head);
        }
        private static void pathsum()
        {
            BNode root = new BNode();

            root.data = 5;
            BNode a = new BNode();

            a.data = 4;
            BNode b = new BNode();

            b.data = 8;
            BNode c = new BNode();

            c.data = 11;
            BNode d = new BNode();

            d.data = 13;
            BNode e = new BNode();

            e.data = 4;
            BNode f = new BNode();

            f.data = 7;
            BNode g = new BNode();

            g.data = 2;
            BNode h = new BNode();

            h.data = 5;
            BNode i = new BNode();

            i.data = 1;

            root.left  = a;
            root.right = b;
            a.left     = c;
            b.left     = d;
            b.right    = e;
            c.left     = f;
            c.right    = g;
            e.left     = h;
            e.right    = i;

            int targetSum = 22;

            TreePrinter.Print(root);
            pathsumhelper(root, 0, targetSum, new List <int>());
        }
        private static void flattenBinaryTree()
        {
            BNode root = new BNode();

            root.data = 5;
            BNode a = new BNode();

            a.data = 4;
            BNode b = new BNode();

            b.data = 8;
            BNode c = new BNode();

            c.data = 11;
            BNode d = new BNode();

            d.data = 13;
            BNode e = new BNode();

            e.data = 4;
            BNode f = new BNode();

            f.data = 7;
            BNode g = new BNode();

            g.data = 2;
            BNode h = new BNode();

            h.data = 5;
            BNode i = new BNode();

            i.data = 1;

            root.left  = a;
            root.right = b;
            a.left     = c;
            b.left     = d;
            b.right    = e;
            c.left     = f;
            c.right    = g;
            e.left     = h;
            e.right    = i;
            TreePrinter.Print(root);
            flattenHelper(root);
            TreePrinter.Print(root);
        }
        private static void binarySearchTree()
        {
            BNode root = insertBST(null, 0);

            root = insertBST(root, 67);
            root = insertBST(root, 55);
            root = insertBST(root, 637);
            root = insertBST(root, 23);
            root = insertBST(root, 78);
            root = insertBST(root, 1);
            root = insertBST(root, 5);
            root = insertBST(root, 15);
            root = insertBST(root, 25);

            TreePrinter.Print(root);
            //root= deleteBST(root,5);
            //TreePrinter.Print(root);
            //root = mirrorBST(root);
            BNode ans = LeastCommonAns(root, 25, 15);

            TreePrinter.Print(root);
            BNode find = searchBST(root, 1);
        }
        private static void zigzagLevelOrder()
        {
            BNode root = new BNode();

            root.data = 5;
            BNode a = new BNode();

            a.data = 4;
            BNode b = new BNode();

            b.data = 8;
            BNode c = new BNode();

            c.data = 11;
            BNode d = new BNode();

            d.data = 13;
            BNode e = new BNode();

            e.data = 4;
            BNode f = new BNode();

            f.data = 7;
            BNode g = new BNode();

            g.data = 2;
            BNode h = new BNode();

            h.data = 5;
            BNode i = new BNode();

            i.data = 1;

            root.left  = a;
            root.right = b;
            a.left     = c;
            b.left     = d;
            b.right    = e;
            c.left     = f;
            c.right    = g;
            e.left     = h;
            e.right    = i;


            TreePrinter.Print(root);

            Stack <BNode>      q   = new Stack <BNode>();
            Stack <BNode>      s   = new Stack <BNode>();
            List <List <int> > res = new List <List <int> >();

            q.Push(root);
            while (q.Count > 0 || s.Count > 0)
            {
                List <int> level = new List <int>();
                while (q.Count > 0)
                {
                    var cur = q.Pop();
                    level.Add(cur.data);
                    if (cur.left != null)
                    {
                        s.Push(cur.left);
                    }
                    if (cur.right != null)
                    {
                        s.Push(cur.right);
                    }
                }
                res.Add(level);

                level = new List <int>();
                while (s.Count > 0)
                {
                    var cur = s.Pop();
                    level.Add(cur.data);
                    if (cur.right != null)
                    {
                        q.Push(cur.right);
                    }
                    if (cur.left != null)
                    {
                        q.Push(cur.left);
                    }
                }
                res.Add(level);
            }


            foreach (var l in res)
            {
                foreach (var data in l)
                {
                    Console.Write("{0} ", data);
                }
                Console.WriteLine();
            }
        }