Реализованы все структуры

This commit is contained in:
FamutdinovMD 2026-05-17 18:18:36 +03:00
parent 147e3da053
commit 5212aff3d6
3 changed files with 131 additions and 3 deletions

View File

@ -7,17 +7,74 @@
def bst_insert(root, name, phone): def bst_insert(root, name, phone):
"""Итеративно вставляет, возвращает новый корень (если корень меняется).""" """Итеративно вставляет, возвращает новый корень (если корень меняется)."""
if root == None:
return {'name': name, 'phone': phone, 'left': None, 'right': None}
current = root
while True:
if current['name'] == name:
current['phone'] == phone
elif current['name'] < name:
if current['left'] == None:
current['left'] = bst_insert(None, name, phone)
return root
else:
current = current['left']
else:
if current['right'] == None:
current['right'] = bst_insert(None, name, phone)
return root
else:
current = current['right']
def bst_find(root, name): def find_node_to_delete(root: dict, name: str) -> dict|None:
"""Поиск в ширину.""" """Поиск в ширину."""
while root != None:
if root['name'] == name:
return root
elif name < root['name']:
root = root['left']
else:
root = root['right']
return None
def find_minimal_child(root: dict) -> dict|None:
while root['left']:
root = root['left']
return root
def bst_delete(root, name): 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:
# Случай 1: нет детей или один ребенок
if root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
# Случай 2: два ребенка
min_node = find_minimal_child(root['right'])
root['name'] = min_node['name']
root['phone'] = min_node['phone']
root['right'] = bst_delete(root['right'], min_node['name'])
return root
def bst_list_all(root): def bst_list_all(root):
"""Центрированный обход. """Центрированный обход.
Рекурсивно собирает записи в отсортированном порядке.""" Рекурсивно собирает записи в отсортированном порядке."""
if root is None:
return []
node_values = {"name": root['name'], "phone": root['phone']}
return bst_list_all(root['left']) + [node_values] + bst_list_all(root['right'])

View File

@ -9,19 +9,53 @@ from LinkedList import *
def hash_fun(name, size) : def hash_fun(name, size) :
"""Принимает имя и возвращает индекс бакета для него.""" """Принимает имя и возвращает индекс бакета для него."""
if size <= 0:
raise ValueError("size должен быть больше 0")
hash_sum = 0
base = 1103
for i, letter in enumerate(name):
power = len(name) - i - 1 # или просто i
hash_sum += ord(letter) * (base ** power)
return hash_sum % size
def ht_insert(buckets, name, phone, blen=50): def ht_insert(buckets, name, phone, blen=50):
"""Возвращает новый массив бакетов """Возвращает новый массив бакетов
Вычисляет индекс, вызывает ll_insert для соответствующего бакета. Вычисляет индекс, вызывает ll_insert для соответствующего бакета.
Функция не меняет размер массива бакетов автоматически!""" Функция не меняет размер массива бакетов автоматически!"""
if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
buckets[index] = ll_insert(buckets[index], name, phone)
return buckets
def ht_delete(buckets, name): def ht_delete(buckets, name):
"""Возвращает новый массив бакетов без элемента с именем name""" """Возвращает новый массив бакетов без элемента с именем name"""
if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
buckets[index] = ll_delete(buckets[index], name)
return buckets
def ht_find(buckets, name): def ht_find(buckets, name):
"""поиск в хеш таблице хз че это загугли""" if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
return ll_find(buckets[index], name)
def ht_list_all(buckets): def ht_list_all(buckets):
"""Собирает все записи из всех бакетов и сортирует""" """Собирает все записи из всех бакетов и сортирует"""
allRecords = []
for bucket in buckets:
allRecords.extend(ll_list_all(bucket))
return sorted(allRecords, key=lambda x: x[0])

View File

@ -12,14 +12,51 @@ def ll_insert(head, name, phone):
голову (если вставка в начало) или изменяет список по ссылке. голову (если вставка в начало) или изменяет список по ссылке.
Удобнее возвращать новую голову, если вставка может быть в начало. Удобнее возвращать новую голову, если вставка может быть в начало.
""" """
newNode = {'name': name, 'phone': phone, 'next': next}
if head == None:
return newNode
currentNode = head
while currentNode ['next'] != None:
currentNode = currentNode['next']
currentNode ['next'] = newNode
return head
def ll_find(head, name): def ll_find(head, name):
"""Ищет узел, возвращает телефон или None.""" """Ищет узел, возвращает телефон или None."""
currentNode = head
while currentNode != None:
if currentNode['name'] == name:
return currentNode['phone']
currentNode = currentNode['next']
return None
def ll_delete(head, name): def ll_delete(head, name):
"""Удаляет узел, возвращает новую голову.""" """Удаляет узел, возвращает новую голову."""
if head == None:
return None
if head['name'] == name:
return head['next']
currentNode = head
while currentNode['next'] != None:
if currentNode['next']['name'] == name:
currentNode['next'] = currentNode['next']['next']
return head
currentNode = currentNode['next']
return head
def ll_list_all(head): def ll_list_all(head):
"""Cобирает все записи в список и сортирует. """Cобирает все записи в список и сортирует.
сортировка вынесена отдельно).""" сортировка вынесена отдельно)."""
records = []
currentNobe = head
while currentNobe != None:
records.append(currentNobe['name'], currentNobe['phone'])
currentNobe = currentNobe['next']
records.sort(key=lambda item: item[0])
return records