реализация двоичного дерева поиска, а также импорт библиотек

This commit is contained in:
Dima 2026-05-10 21:16:48 +03:00
parent 57fa3a3232
commit 6c9a56505a

View File

@ -169,11 +169,128 @@ def ht_list_all(buckets):
bubble_sort(full_data)
return full_data
Hash_table1 = hash_table(3)
#Hash_table1 = hash_table(3)
ht_insert(Hash_table1, 'Alena', '010')
ht_insert(Hash_table1, 'Helena', '111')
ht_insert(Hash_table1, 'Gena', '222')
#ht_insert(Hash_table1, 'Alena', '010')
#ht_insert(Hash_table1, 'Helena', '111')
#ht_insert(Hash_table1, 'Gena', '222')
print(ht_list_all(Hash_table1))
#print(ht_list_all(Hash_table1))
def bst_insert(root, name, phone):
"""
рекурсивная вставка или обновление записи
возвращает новый корень (если корень меняется)
"""
# если дерево пусто, создаём новый узел
if root is None:
return {'name': name, 'phone': phone, 'left': None, 'right': None}
# вставка в левое поддерево
if name < root['name']:
root['left'] = bst_insert(root['left'], name, phone)
# вставка в правое поддерево
elif name > root['name']:
root['right'] = bst_insert(root['right'], name, phone)
# имя уже существует — обновляем телефон
else:
root['phone'] = phone
return root
def bst_find(root, name):
"""
рекурсивный поиск телефона по имени
возвращает phone или None
"""
# не нашли
if root is None:
return None
# нашли
if root['name'] == name:
return root['phone']
# ищем в левом поддереве
elif name < root['name']:
return bst_find(root['left'], name)
# ищем в правом поддереве
else:
return bst_find(root['right'], name)
def bst_find_min(node):
"""вспомогательная функция: поиск узла с минимальным ключом"""
current = node
while current['left'] is not None:
current = current['left']
return current
def bst_delete(root, name):
"""
рекурсивное удаление записи по имени
возвращает новый корень
"""
# дерево пусто
if root is None:
return None
# спускаемся в левое поддерево
if name < root['name']:
root['left'] = bst_delete(root['left'], name)
# спускаемся в правое поддерево
elif name > root['name']:
root['right'] = bst_delete(root['right'], name)
# нашли удаляемый узел
else:
if root['left'] is None and root['right'] is None:
return None
elif root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
# находим минимальный элемент в правом поддереве
successor = bst_find_min(root['right'])
# копируем данные из преемника в текущий узел
root['name'] = successor['name']
root['phone'] = successor['phone']
# удаляем преемника
root['right'] = bst_delete(root['right'], successor['name'])
return root
def bst_list_all(root, result=None):
"""
центрированный (in-order) обход дерева
рекурсивно собирает записи в отсортированном порядке
"""
if result is None:
result = []
if root is not None:
# сначала обходим левое поддерево (все меньшие ключи)
bst_list_all(root['left'], result)
# затем текущий узел
result.append((root['name'], root['phone']))
# затем правое поддерево (все большие ключи)
bst_list_all(root['right'], result)
return result