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