Вдохновленный недавним вопросом о SO ...
Напишите функцию для печати двоичного дерева в следующем формате:
3
/ \
1 5
\ / \
2 4 6
- Вывод должен состоять из строки узлов, за которой следуют строка
/
и\
символы, обозначающие отношения, за которыми следует строка узлов и т. Д. - Вы можете предположить, что все узлы представимы как один символ.
- Соседние узлы на самом низком уровне должны быть разделены хотя бы одним пробелом, узлы, расположенные дальше, должны быть разделены соответствующим образом
- Узлы с двумя детьми должны быть расположены точно посередине их прямых детей.
- Косая черта в отношениях должна быть на полпути между родителем и соответствующим ребенком (в зависимости от того, что вы хотите).
Входные данные:
Входные данные будут предоставлены в качестве аргумента вашей функции. Я не буду указывать точную структуру дерева, однако оно должно использоваться как фактическое двоичное дерево. Никакие «деревья не представлены в моей программе как строки, совпадающие с ожидаемым результатом».
Вы можете распечатать в выходной поток или вернуть строку, содержащую вывод, на ваш выбор.
Очки за самый короткий код, но я бы предпочел полностью работающее длинное решение, чем 90% работающее короткое.
Обновление для награды:
Для награды я (Оптимизатор) делаю небольшие изменения:
- Ввод может быть из STDIN, ARGV или аргумента функции.
- Вывод должен быть на STDOUT (или
console.log
для JS) - Вы можете предположить, что ввод в виде массива, например.
[1,2,3]
или[1 2 3]
Обновление 2 - двоичное дерево на самом деле должно быть двоичным деревом поиска. Поскольку я не упомянул об этом изначально, я позволю пользователям рассматривать преобразование обычного массива в массив бинарного дерева поиска как отдельную программу, и окончательный счетчик байтов будет только для программы, которая примет массив в качестве аргумента и напечатает его как двоичное дерево.
30000,1000,499999
Ответы:
Фортран 77 - 1085 символов
Дерево представлено во входном массиве
t
обычным способом, root в 1, root-> left в 2, root-> right в 3 root-> left-> left в 4 ...Выход должен соответствовать обычному терминалу глубиной до 5 уровней.
Я использую ровно одну косую черту между каждой парой узлов, которая выглядит довольно глупо в верхней части, когда есть четыре или более уровней. Я допускал до трехзначных узлов.
Полная программа с комментариями и стартовой леской:
Вывод с вводом, эквивалентным примеру:
источник
CJam,
10099 байтовВходные данные должны быть списком символов без каких-либо управляющих символов ascii. Пустые узлы обозначаются пробелом. Это также должно быть идеальное двоичное дерево с ровно 2 n -1 узлами.
Пример:
Или просто используйте строки:
Выход:
объяснение
Конверсионный скрипт
Он принимает либо символы, либо однозначные числа.
Примеры (все одинаковые):
Выход:
Это простая декартова конструкция дерева.
источник
Python 2, 411 байт
Примечание. Первый уровень отступа - 1 пробел, второй - одна вкладка.
Вызов
f
со списком односимвольных строк илиNone
, например.f(['1',None,'3'])
, Список не может быть пустым.Это должно подчиняться правилам для щедрости.
Скрипт конвертера:
Преобразует и массив в формат, используемый принтером бинарного дерева. Пример:
-
Примеры:
Для их запуска вы должны иметь имя основного файла
bt.py
и имя файла конвертераconv.py
.источник
['1','2','3','4','5','6','7','8','9']
массива не тот, который вы показали. Он должен иметь3
в качестве правого потомка того,2
чей правый потомок1
является корневым элементом.APL, 125 символов
Пример:
Проверено здесь.
источник
Рубин, 265 байт
Версия @proudhaskeller, 269 байтов
Explaination
Подробная версия:
пример
дает:
(Я еще не написал скрипт конвертации.)
источник