Ваш код, приведенный выше, является «действительной» реализацией двоичного дерева ... он уже завершен. У вас есть узлы (которые вы вызываете Tree
s), и каждый узел может иметь 0, 1 или 2 детей. edit На самом деле я просто понял, что вы не можете реализовать пустое дерево, используя вашу реализацию, но это небольшая нитьчка.
Это семантическая вещь, но она «важна». Бинарное дерево само по себе вообще не используется для проблем. Стандартное двоичное дерево не очень полезно - это просто дерево, где каждый узел имеет не более двух детей. Эта ссылка должна уточнить, что я говорю (и, вероятно, содержит достаточный ответ на ваш вопрос): https://stackoverflow.com/a/2159506.
Я думаю, что вас интересует «сбалансированное двоичное дерево поиска», которое имеет дополнительные свойства. В частности, он «упорядочен» слева направо (это неопределенное описание, но я не хочу быть волнообразным и говорить, что «левый ребенок меньше родителя и его брата», когда он действительно может быть равным в некоторых реализациях). Он также имеет ограниченную глубину O(log(n))
(у вас не будет деревьев с высотой n
с n
объектами в нем ... которые являются только связанным списком).
В любом случае, чтобы ответить на ваш вопрос: это своего рода скучно, но общее предложение - реализовать абстрактную структуру данных, такую как куча или словарь. Обратите внимание на терминологию: куча может быть реализована с использованием двоичного дерева поиска. Куча, по определению, не привязана ни к какой реализации. Для этого требуется только выполнение определенных операций (например, peek(), min(), add()
и т. Д.). Выбор примитивной структуры данных, такой как двоичное дерево, необходим для создания кучи (иначе это просто абстрактная вещь, плавающая в вашей голове). Выбор сбалансированного дерева двоичного поиска также дает временные сложности для этих операций (например, куча, реализованная со сбалансированным двоичным деревом поиска, имеет O(log(n)) peek()
. См. Ссылку на wiki для получения дополнительной информации: http://en.wikipedia.org/wiki/Heap_(data_structure)#Comparison_of_theoretic_bounds_for_variants).
Как только вы написали кучу, вы можете посмотреть любую проблему, в алгоритме которой используется куча ... там много. Скажем, вы хотите найти k
самый большой элемент в линейном времени. Куча (доказать это немного сложно). Что делать, если вы хотите реализовать алгоритм Prim? Heap. Что делать, если вы хотите сортировать произвольные объекты с наихудшим случаем O(n log(n))
? Heapsort (обратите внимание, что обычно люди не используют кучу сортировки, так как это не очень быстро).
[Деревья двоичного поиска] (http://en.wikipedia.org/wiki/Binary_search_tree) довольно популярны, решая проблему эффективной работы с отсортированным набором, если это отвечает на ваш вопрос. Хотя просить примеры вещей обычно [«неконструктивно»] (http://stackoverflow.com/faq#close). – Dukeling