Какая структура данных лучше всего может быть использована для реализации двоичного дерева в Python?
104
Какая структура данных лучше всего может быть использована для реализации двоичного дерева в Python?
Ответы:
Вот моя простая рекурсивная реализация двоичного дерева поиска.
источник
node is not None
вместо вашего(node!=None)
. Кроме того, вы можете использовать__str__
функцию вместо метода printTree.def _find(self, val, node): if(val == node.v): return node elif(val < node.v and node.l != None): return self._find(val, node.l) elif(val > node.v and node.r != None): return self._find(val, node.r)
left<=root<=right
?Подробнее об этом здесь: -Это очень простая реализация двоичного дерева.
Это хороший урок с вопросами между ними.
источник
insertLeft
работает и будет создавать бесконечный цикл при любой попытке рекурсивно пройти вниз по крайней левой ветви двоичного дерева[Что вам нужно для собеседований] Класс Node - это структура данных, достаточная для представления двоичного дерева.
(Хотя другие ответы в основном верны, они не требуются для двоичного дерева: нет необходимости расширять класс объекта, нет необходимости быть BST, нет необходимости импортировать двухстороннюю очередь).
Вот пример дерева:
В этом примере n1 - корень дерева, имеющего n2, n3 в качестве его дочерних элементов.
источник
Простая реализация BST на Python
источник
Очень быстрый и грязный способ реализации двоичного дерева с использованием списков. Не самый эффективный и не слишком хорошо обрабатывает нулевые значения. Но это очень прозрачно (по крайней мере, для меня):
Построение дерева из итерации:
Переход по дереву:
источник
Я не могу не заметить, что в большинстве ответов здесь реализовано двоичное дерево поиска. Двоичное дерево поиска! = Двоичное дерево.
Дерево двоичного поиска имеет очень специфическое свойство: для любого узла X ключ X больше, чем ключ любого потомка его левого дочернего элемента, и меньше ключа любого потомка его правого дочернего элемента.
Двоичное дерево не накладывает таких ограничений. Двоичное дерево - это просто структура данных с «ключевым» элементом и двумя дочерними элементами, например «левым» и «правым».
Дерево - это еще более общий случай двоичного дерева, в котором каждый узел может иметь произвольное количество дочерних элементов. Как правило, каждый узел имеет «дочерний» элемент типа список / массив.
Теперь, чтобы ответить на вопрос OP, я включаю полную реализацию двоичного дерева в Python. Базовая структура данных, в которой хранится каждый BinaryTreeNode, представляет собой словарь, поскольку он предлагает оптимальные поисковые запросы O (1). Я также реализовал обходы в глубину и в ширину. Это очень распространенные операции, выполняемые с деревьями.
источник
вам не нужно иметь два класса
источник
Еще немного «питонического»?
источник
источник
Node
Класс связанных узлов на основе A - это стандартный подход. Это может быть трудно визуализировать.Мотивированный из эссе на Patterns Python - реализация графов , рассмотрим простой словарь:
Дано
Бинарное дерево
Код
Составьте словарь уникальных узлов:
подробности
find_all_paths()
. Ресурсы ).Древовидные функции часто включают следующие общие операции:
Попробуйте выполнить все эти операции. Здесь мы демонстрируем одну из этих функций - обход BFS:
пример
Это алгоритм поиска в ширину (порядок уровней), применяемый к dict узлов и потомков.
deque
, но работает aqueue
или alist
(последнее неэффективно).См. Также это подробное руководство по деревьям.
В поле зрения
Что-то замечательное в обходах в целом, мы можем легко изменить последний итеративный подход к поиску в глубину (DFS) , просто заменив очередь стеком (также известным как LIFO Queue). Это просто означает, что мы выводим из очереди с той же стороны, что и помещаем в очередь. DFS позволяет нам искать каждую ветку.
Как? Поскольку мы используем a
deque
, мы можем эмулировать стек, изменив егоnode = q.popleft()
наnode = q.pop()
(справа). Результатом является право благоприятствования, предзаказ ДФС :['a', 'c', 'f', 'b', 'e', 'd']
.источник
источник
Эта реализация поддерживает операции вставки, поиска и удаления без разрушения структуры дерева. Это не бантовое дерево.
источник
Я знаю, что уже было опубликовано много хороших решений, но у меня обычно есть другой подход к двоичным деревьям: использование некоторого класса Node и его непосредственная реализация более читабельны, но когда у вас много узлов, он может стать очень жадным в отношении памяти, поэтому я предлагаем добавить один уровень сложности и сохранить узлы в списке Python, а затем смоделировать поведение дерева, используя только список.
Вы по-прежнему можете определить класс Node для окончательного представления узлов в дереве, когда это необходимо, но сохранение их в простой форме [значение, слева, справа] в списке будет использовать половину памяти или меньше!
Вот быстрый пример класса Binary Search Tree, хранящего узлы в массиве. Он предоставляет основные функции, такие как добавление, удаление, поиск ...
Я добавил родительский атрибут, чтобы вы могли удалить любой узел и сохранить структуру BST.
Извините за удобочитаемость, особенно за функцию "удалить". Обычно, когда узел удаляется, мы извлекаем массив дерева и заменяем его последним элементом (кроме случаев, когда мы хотим удалить последний узел). Чтобы сохранить структуру BST, удаленный узел заменяется максимумом его левых дочерних элементов или минимумом его правых дочерних элементов, и необходимо выполнить некоторые операции, чтобы индексы оставались действительными, но это достаточно быстро.
Я использовал эту технику для более сложных вещей, чтобы создать несколько словарей громких слов с внутренним основанием системы счисления, и мне удалось разделить потребление памяти на 7-8 (вы можете увидеть пример здесь: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
источник
Хорошая реализация двоичного дерева поиска , взятая отсюда :
источник
Я хочу показать вариант метода @apadana, который более полезен при большом количестве узлов:
источник
источник
Двоичное дерево в Python
источник
Вот простое решение, которое можно использовать для построения двоичного дерева с использованием рекурсивного подхода для отображения дерева в порядке обхода, использованного в приведенном ниже коде.
Код взят из: Двоичное дерево в Python
источник