static void PrintVertical(Tree tree, int height, List <List <TreeNode> > levels)
        {
            var length    = tree.Max().ToString().Length;
            var maxHeight = height;
            var maxTop    = 0;
            var basicTop  = Console.CursorTop + 1;

            var rightHeight = (int)Math.Pow(2, maxHeight - tree.RightHeight() - 1) - 1;

            foreach (var level in levels)
            {
                var count = 0;
                var shift = (int)Math.Pow(2, height - 1) - 1;

                bool isLeft = false;

                foreach (var item in level.Reverse <TreeNode>())
                {
                    if (item != null)
                    {
                        var top = shift + count * 2 * (shift + 1) - rightHeight + basicTop;
                        maxTop = (top > maxTop) ? top : maxTop;
                        var left = (maxHeight - height) * (length + 1) + 1;
                        Console.SetCursorPosition(left, top);

                        Console.Write(item.Key);
                        if (isLeft && top >= length && left > 1)
                        {
                            Console.SetCursorPosition(left - 1, top);
                            Console.Write('\\');
                            for (int i = 0; i < shift; i++)
                            {
                                top--;
                                Console.SetCursorPosition(left - 2, top);
                                Console.Write('|');
                            }
                        }
                        else if (left > 1)
                        {
                            Console.SetCursorPosition(left - 1, top);
                            Console.Write('/');
                            for (int i = 0; i < shift; i++)
                            {
                                top++;
                                Console.SetCursorPosition(left - 2, top);
                                Console.Write('|');
                            }
                        }
                    }
                    count++;
                    isLeft = !isLeft;
                }
                Console.SetCursorPosition(0, 0);
                height--;
            }
            Console.SetCursorPosition(0, maxTop + 2);
        }
        static void PrintHorisontal(Tree tree, int height, List <List <TreeNode> > levels)
        {
            var basicTop  = Console.CursorTop + 2;
            var length    = tree.Max().ToString().Length;
            var maxHeight = height;

            foreach (var level in levels)
            {
                var count = 0;
                var shift = length * ((int)Math.Pow(2, height) - 1);

                bool isLeft = true;

                foreach (var item in level)
                {
                    if (item != null)
                    {
                        var left = shift + count * 2 * (shift + length);
                        var top  = 2 * (maxHeight - height) + basicTop;
                        Console.SetCursorPosition(left, top);

                        Console.Write(item.Key);
                        if (isLeft && top > basicTop)
                        {
                            Console.SetCursorPosition(left + length, top - 1);
                            Console.Write('/');
                            for (int i = 0; i < shift; i++)
                            {
                                Console.Write('-');
                            }
                        }
                        else if (top > basicTop)
                        {
                            Console.SetCursorPosition(left - shift - 1, top - 1);
                            for (int i = 0; i < shift; i++)
                            {
                                Console.Write('-');
                            }
                            Console.Write('\\');
                        }
                    }
                    count++;
                    isLeft = !isLeft;
                }
                height--;
            }
            Console.SetCursorPosition(0, maxHeight * 2 + basicTop);
        }