Как я могу напечатать бинарное дерево в Java, чтобы вывод был похож на:
4
/ \
2 5
Мой узел:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
источник
источник
Ответы:
Я создал простой принтер двоичного дерева. Вы можете использовать и изменять его, как хотите, но он все равно не оптимизирован. Я думаю, что здесь многое можно улучшить;)
Выход 1:
Выход 2:
источник
Распечатать [большое] дерево по линиям.
пример вывода:
код:
PS Этот ответ точно не фокусируется на «двоичных» деревьях - он печатает все виды деревьев. Решение вдохновлено командой "tree" в linux.
источник
children.get(children.size() - 1)
если бы HashMap использовался для детей? Мне удалось изменить все остальные части, кроме этой.HashMap<String, List<String>>
?HashMap<String, Node>
. Строка - это идентификатор узла.Я сделал улучшенный алгоритм для этого, который прекрасно обрабатывает узлы с разным размером. Он печатает сверху вниз, используя линии.
Чтобы использовать это для своего дерева, позвольте вашему
Node
классу реализоватьPrintableNode
.Пример вывода:
источник
???????????
вместо строк между узлами, но должно быть только некоторые проблемы UTF8 и вещи. Во всяком случае, замечательные вещи, я должен сказать. Лучший ответ для меня, так как он действительно прост в использовании.public static <T> void print(T[] elems)
напечатает:
для ввода
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
это вариант ответа @ anurag - мне было жаль видеть лишние | s
источник
Адаптировано из ответа Васи Новикова , чтобы сделать его более двоичным , и использовать для эффективности (объединение объектов в Java в общем случае неэффективно).
StringBuilder
String
Вывод:
источник
right != null
выполнил редактирование и проверил его, он работает нормально.мичал.креузман хороший, мне придется сказать.
Я чувствовал себя ленивым, чтобы сделать программу самостоятельно и искать код в сети, когда я обнаружил, что это действительно помогло мне.
Но я боюсь увидеть, что он работает только для однозначных цифр, как если бы вы собирались использовать более одной цифры, так как вы используете пробелы, а не символы табуляции, структура будет потеряна, и программа потеряет свое использование.
Что касается моих более поздних кодов, мне нужны были большие входные данные (по крайней мере, больше 10), это не сработало для меня, и после поисков в сети, когда я ничего не нашел, я сам создал программу.
У него есть некоторые ошибки, опять же, сейчас мне лень их исправлять, но он печатает очень красиво, и узлы могут принимать любое большое значение.
Дерево не будет таким, как упоминалось в вопросе, но оно повернуто на 270 градусов :)
Поместите эту функцию с вашим собственным указанным TreeNode и держите уровень изначально 0, и наслаждайтесь!
Вот некоторые примеры выходных данных:
Единственная проблема с расширяющимися ветвями; Я постараюсь решить проблему как можно скорее, но до тех пор вы тоже можете ее использовать.
источник
Вашему дереву потребуется удвоенное расстояние для каждого слоя:
Вы можете сохранить свое дерево в массиве массивов, по одному массиву на каждую глубину:
Если ваше дерево не заполнено, вам нужно включить пустые значения в этот массив:
Затем вы можете выполнить итерацию по массиву, чтобы напечатать ваше дерево, печатая пробелы перед первым элементом и между элементами в зависимости от глубины и печатая строки в зависимости от того, заполнены ли соответствующие элементы в массиве для следующего слоя или нет. Если ваши значения могут быть длиной более одного символа, вам нужно найти самое длинное значение при создании представления массива и соответственно умножить все ширины и количество строк.
источник
Я нашел ответ ВасяНовикова очень полезным для печати большого общего дерева и изменил его для бинарного дерева
Код:
Пример вывода:
источник
Решение на языке Scala , аналогичное тому, что я написал в Java :
Пример вывода:
источник
Я знаю, что у вас всех есть отличное решение; Я просто хочу поделиться своим - может быть, это не лучший способ, но он идеально подходит для меня!
С
python
и такpip
, это действительно довольно просто! БУМ!На Mac или Ubuntu (у меня есть Mac)
$ pip install drawtree
$python
введите консоль Python; Вы можете сделать это по-другомуfrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
СДЕЛАНО!
Отслеживание источника:
Прежде чем я увидел этот пост, я зашел в Google "бинарное дерево простого текста"
И я нашел это https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , направьте меня на этот https://github.com/msbanik/drawtree
источник
java
ожидает ответ от Java :)источник
Это очень простое решение для распечатки дерева. Это не так красиво, но это действительно просто:
Пример вывода:
источник
На основании ответа ВасяНовикова. Улучшено с помощью магии Java: универсальный и функциональный интерфейс.
Пример начального вызова:
Будет выводить что-то вроде
источник
Я написал двоичное дерево принтер на Java.
Код есть на GitHub здесь .
Он не был оптимизирован для повышения эффективности во время выполнения, но, поскольку мы говорим о печати в ASCII, я решил, что он не будет использоваться на очень больших деревьях. У этого есть некоторые хорошие особенности все же.
Некоторые демонстрационные / тестовые программы включены.
Ниже приведен пример случайно сгенерированного двоичного дерева, напечатанного программой. Это иллюстрирует эффективное использование пространства с большим правым поддеревом, простирающимся под маленьким левым поддеревом:
Пример печати всех пяти узловых двоичных деревьев (с метками в порядке) на странице:
Ниже приведен пример того же дерева, напечатанного 4 разными способами, с горизонтальным интервалом 1 и 3 и с диагональными и горизонтальными ветвями.
источник
@Makyen
в комментарий.Это интересный вопрос, и я также написал проект для него.
бинарное дерево-принтер
Вот некоторые примеры:
Распечатать случайный BST.
Печатать дерево из массива порядка уровня в стиле leetcode, «#» означает терминатор пути, где ни один узел не существует ниже.
источник
Мне нужно было распечатать двоичное дерево в одном из моих проектов, для этого я подготовил класс Java
TreePrinter
, один из примеров вывода:Вот код для класса
TreePrinter
вместе с классомTextNode
. Для печати любого дерева вы можете просто создать эквивалентное дерево сTextNode
классом.Наконец, вот тестовый класс для печати данного образца:
источник
Вы можете использовать апплет для визуализации этого очень легко. Вам необходимо распечатать следующие пункты.
Распечатать узлы в виде кругов с некоторым видимым радиусом
Получить координаты для каждого узла.
Координата x может быть визуализирована как количество узлов, посещенных до посещения узла в его обходе по порядку.
Координата y может быть визуализирована как глубина конкретного узла.
Распечатать строки между родителями и детьми
Это можно сделать, сохранив координаты x и y узлов и родителей каждого узла в отдельных списках.
Для каждого узла, кроме корневого, соедините каждый узел с его родителем, взяв координаты x и y дочернего элемента и родительского элемента.
источник
https://github.com/murtraja/java-binary-tree-printer
работает только от 1 до 2 цифр (мне было лень, чтобы сделать его универсальным)
источник
Это было самое простое решение для горизонтального обзора. Пробовал с кучей примеров. Хорошо работает для моей цели. Обновлено с ответа @ nitin-k.
Вызов:
Решение:
источник
node_length * nodes_count + space_length * spaces_count*
.Код на GitHub: YoussefRaafatNasry / bst-ascii-визуализация
источник
visualize
функция, это целыйvisualizer
класс, который составляет около 200 loc, включая заголовочный файл.Для тех, кто ищет решение Rust:
Вывод примерно такой:
источник
Печать в консоли:
Простой код:
источник
Вот очень универсальный древовидный принтер. Не самый красивый, но он справляется со многими случаями. Не стесняйтесь добавлять косые черты, если вы можете понять это.
Класс NodeInfo
Класс NodePosition
И, наконец, Node Interface
источник
Решение Scala, адаптированное на основе ответа Васи Новикова и предназначенное для бинарных деревьев:
источник
Смотрите также эти ответы .
В частности, не было слишком сложно использовать abego TreeLayout для получения результатов, показанных ниже, с настройками по умолчанию.
Если вы попробуете этот инструмент, обратите внимание на следующее предостережение: он печатает детей в порядке их добавления. Для BST, где левые против правых дел, я нашел эту библиотеку неуместной без изменений.
Кроме того , способ добавить ребенок просто берет
parent
иchild
узел в качестве параметров. (Таким образом, чтобы обработать группу узлов, вы должны взять первый отдельно для создания рута.)Я закончил тем, что использовал это решение выше, изменив его так, чтобы он принимал тип,
<Node>
чтобы иметь доступNode
слева и справа (дочерние элементы).источник
Вот еще один способ визуализации вашего дерева: сохраните узлы в виде XML-файла, а затем позвольте вашему браузеру показать вам иерархию:
Вот код, чтобы проверить это:
И вывод выглядит так:
источник
источник
это одна из самых простых версий, которую я мог реализовать. я надеюсь, что это поможет вам
источник