From 6c9a56505a2729c60e383d49d241cd4b12a3a578 Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 10 May 2026 21:16:48 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=B0,=20=D0=B0=20=D1=82=D0=B0=D0=BA?= =?UTF-8?q?=D0=B6=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nikolaevda/task1/Zadanie1.py | 127 +++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 5 deletions(-) diff --git a/nikolaevda/task1/Zadanie1.py b/nikolaevda/task1/Zadanie1.py index cdb49d9..2a6d4ed 100644 --- a/nikolaevda/task1/Zadanie1.py +++ b/nikolaevda/task1/Zadanie1.py @@ -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)) \ No newline at end of file +#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 \ No newline at end of file