Найти в Дзене
Crybli

Python Бинарное дерево

Бинарное дерево — это структура данных, в которой каждый узел имеет до двух дочерних. Дочерние узлы называются левым и правым. Бинарное дерево может использоваться для хранения упорядоченного набора данных, таких как числа или строки.

источник Яндекс картинки
источник Яндекс картинки

Для реализации бинарного дерева в Python сначала определяем класс узла, который будет содержать значение элемента и ссылки на левого и правого потомков:

class Node:
def __init__(self, value):
self.value = value
self.left_child = None
self.right_child = None

Далее определим класс дерева, который будет содержать корневой узел и методы для добавления и поиска элементов:

class BinaryTree:
def __init__(self):
self.root = None

def __repr__(self):
return f"<BinaryTree object root={self.root}>"

def add_node(self, value):
if self.root is None:
self.root = Node(value)
else:
self._add_node(value, self.root)

def _add_node(self, value, node):
if value < node.value:
if node.left_child is None:
node.left_child = Node(value)
else:
self._add_node(value, node.left_child)
else:
if node.right_child is None:
node.right_child = Node(value)
else:
self._add_node(value, node.right_child)

def find_node(self, value):
if self.root is None:
return None
else:
return self._find_node(value, self.root)

def _find_node(self, value, node):
if value == node.value:
return node
elif value < node.value and node.left_child is not None:
return self._find_node(value, node.left_child)
elif value > node.value and node.right_child is not None:
return self._find_node(value, node.right_child)
else:
return None

Метод add_node() используется для добавления нового элемента в дерево. Если дерево пустое, создается корневой узел. Иначе, вызывается защищенный метод _add_node(), который рекурсивно ищет позицию для нового узла в соответствии со значением.

источник Яндекс картинки
источник Яндекс картинки

Метод find_node() используется для поиска элемента в дереве. Если дерево пустое, возвращается значение None. Иначе, вызывается защищенный метод _find_node(), который рекурсивно проверяет каждый узел, начиная с корневого, пока не будет найдено значение.

Пример использования бинарного дерева:

# Создаем дерево и добавляем элементы
tree = BinaryTree()
tree.add_node(5)
tree.add_node(2)
tree.add_node(7)
tree.add_node(1)
tree.add_node(3)
tree.add_node(6)
tree.add_node(9)

# Поиск элементов в дереве
assert tree.find_node(5).value == 5
assert tree.find_node(2).value == 2
assert tree.find_node(7).value == 7
assert tree.find_node(1).value == 1
assert tree.find_node(3).value == 3
assert tree.find_node(6).value == 6
assert tree.find_node(9).value == 9

В данном примере мы создали бинарное дерево, добавили элементы и произвели поиск по значению.

В бинарном дереве имеются некоторые понятия, которые важны для понимания его работы:

  • Корень (root) - это узел, который является началом дерева.
  • Лист (leaf) - это узел без потомков.
  • Высота (height) - это количество уровней в дереве.
  • Глубина (depth) - это количество родительских узлов в дереве от заданного узла до корня. Корень имеет глубину 0.
  • Балансировка дерева - это процесс перестройки дерева для уменьшения разницы между высотами левого и правого поддеревьев.

Бинарное дерево может быть использовано для решения различных задач, таких как:

  • Двоичный поиск - операция поиска определенного элемента в отсортированном массиве или векторе используя бинарное дерево.
  • Арифметические выражения - использование бинарного дерева для представления арифметического выражения в виде дерева, где каждый узел представляет оператор, а листья представляют операнды.
  • Huffman Encoding - использование бинарного дерева для эффективного сжатия данных.

Бинарное дерево имеет логарифмическую временную сложность для поиска, удаления и добавления элементов, что делает его очень эффективным для работы с большими наборами данных. Однако, если дерево не сбалансировано, его производительность может значительно ухудшаться. Поэтому, важно уметь выбирать правильный алгоритм балансировки дерева в зависимости от решаемой задачи.