Алгоритмы на Python

Двоичное дерево поиска на Python

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

Что такое Двоичное дерево поиска на Python?

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

Постройте двоичное дерево поиска на Python: вставляйте значения, ищите их и выводите в отсортированном порядке.

Когда это использовать?

  • Понимать алгоритмы и структуры данных.
  • Наблюдать каждый шаг и проверять граничные случаи.
  • Сравнивать время работы и память.

Как это работает

Вставляйте значения и смотрите, куда они попадают, ищите значение и следите за его путём, запускайте обход и смотрите порядок посещения.

Пример кода

Запустить код →
main.py
class Node:
    def __init__(self, value):
        self.value = value
        self.left = None   # smaller values go left
        self.right = None  # larger values go right


def insert(node, value):
    if node is None:
        return Node(value)
    if value < node.value:
        node.left = insert(node.left, value)
    elif value > node.value:
        node.right = insert(node.right, value)
    return node


def contains(node, value):
    # Each comparison discards one whole subtree.
    while node is not None:
        if value == node.value:
            return True
        node = node.left if value < node.value else node.right
    return False


def inorder(node):
    # Left subtree, node, right subtree: visits values in sorted order.
    if node is None:
        return []
    return inorder(node.left) + [node.value] + inorder(node.right)


def height(node):
    if node is None:
        return 0
    return 1 + max(height(node.left), height(node.right))


root = None
for value in [50, 30, 70, 20, 40, 60, 80]:
    root = insert(root, value)

print("inorder:", inorder(root))
print("contains 60:", contains(root, 60))
print("contains 65:", contains(root, 65))
print("height:", height(root))

Ожидаемый результат

inorder: [20, 30, 40, 50, 60, 70, 80]
contains 60: True
contains 65: False
height: 3

Как это работает

insert() спускается от корня и прикрепляет значение на его место. contains() идёт только по одному пути, что в сбалансированном дереве занимает O(log n) шагов. Симметричный обход (inorder) посещает левое поддерево, узел и правое поддерево, поэтому значения выходят отсортированными.

Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.

Практические задания

Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.

  1. Проверьте пустой ввод, один элемент и дубликаты.
  2. Выводите состояние после каждого шага.
  3. Сравните производительность с другим решением.
Запустить в Python IDE →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи