Двоичное дерево поиска на Python
Двоичное дерево поиска хранит меньшие значения в левом поддереве, а большие - в правом, поэтому каждое сравнение отбрасывает половину оставшегося дерева.
Что такое Двоичное дерево поиска на Python?
Двоичное дерево поиска хранит меньшие значения в левом поддереве, а большие - в правом, поэтому каждое сравнение отбрасывает половину оставшегося дерева.
Постройте двоичное дерево поиска на Python: вставляйте значения, ищите их и выводите в отсортированном порядке.
Когда это использовать?
- Понимать алгоритмы и структуры данных.
- Наблюдать каждый шаг и проверять граничные случаи.
- Сравнивать время работы и память.
Как это работает
Вставляйте значения и смотрите, куда они попадают, ищите значение и следите за его путём, запускайте обход и смотрите порядок посещения.
Пример кода
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.
Практические задания
Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.
- Проверьте пустой ввод, один элемент и дубликаты.
- Выводите состояние после каждого шага.
- Сравните производительность с другим решением.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Tree Diameter A tree is a connected undirected graph with no cycles. Средне
- Размеры папок с Composite Вычислить общий размер каждой папки в дереве, где папки содержат файлы и другие папки. Средне