forked from UNN/2026-rff_mp
Обновить KislyuninED/docks/data/1-st-exercize/main.py
This commit is contained in:
parent
2052f2c4b8
commit
d263bab16d
|
|
@ -47,6 +47,10 @@ def ll_list_all(head):
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# хеш-функция – сумма ord(name) % size
|
||||
def _hash(name, size):
|
||||
h = 0
|
||||
|
|
@ -81,4 +85,100 @@ def ht_list_all(buckets):
|
|||
all_records.append((curr['n'], curr['p']))
|
||||
curr = curr['nxt']
|
||||
all_records.sort(key=lambda x: x[0])
|
||||
return all_records
|
||||
return all_records
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Узел дерева: {'n': имя, 'p': телефон, 'l': левый, 'r': правый}
|
||||
def bst_create_node(name, phone):
|
||||
return {'n': name, 'p': phone, 'l': None, 'r': None}
|
||||
|
||||
def bst_insert(root, name, phone):
|
||||
if root is None:
|
||||
return bst_create_node(name, phone)
|
||||
# итеративная вставка (без рекурсии)
|
||||
parent = None
|
||||
cur = root
|
||||
while cur:
|
||||
parent = cur
|
||||
if name == cur['n']:
|
||||
cur['p'] = phone
|
||||
return root
|
||||
elif name < cur['n']:
|
||||
cur = cur['l']
|
||||
else:
|
||||
cur = cur['r']
|
||||
# вставляем как лист
|
||||
if name < parent['n']:
|
||||
parent['l'] = bst_create_node(name, phone)
|
||||
else:
|
||||
parent['r'] = bst_create_node(name, phone)
|
||||
return root
|
||||
|
||||
def bst_find(root, name):
|
||||
cur = root
|
||||
while cur:
|
||||
if name == cur['n']:
|
||||
return cur['p']
|
||||
elif name < cur['n']:
|
||||
cur = cur['l']
|
||||
else:
|
||||
cur = cur['r']
|
||||
return None
|
||||
|
||||
def _bst_min(node):
|
||||
while node['l']:
|
||||
node = node['l']
|
||||
return node
|
||||
|
||||
def bst_delete(root, name):
|
||||
if root is None:
|
||||
return None
|
||||
# поиск узла и родителя
|
||||
parent = None
|
||||
cur = root
|
||||
while cur and cur['n'] != name:
|
||||
parent = cur
|
||||
if name < cur['n']:
|
||||
cur = cur['l']
|
||||
else:
|
||||
cur = cur['r']
|
||||
if cur is None:
|
||||
return root
|
||||
# случай 0 или 1 ребёнок
|
||||
if cur['l'] is None or cur['r'] is None:
|
||||
child = cur['l'] if cur['l'] else cur['r']
|
||||
if parent is None:
|
||||
return child
|
||||
if parent['l'] == cur:
|
||||
parent['l'] = child
|
||||
else:
|
||||
parent['r'] = child
|
||||
else:
|
||||
# два ребёнка – ищем inorder-преемника
|
||||
succ_parent = cur
|
||||
succ = cur['r']
|
||||
while succ['l']:
|
||||
succ_parent = succ
|
||||
succ = succ['l']
|
||||
cur['n'], cur['p'] = succ['n'], succ['p']
|
||||
if succ_parent['l'] == succ:
|
||||
succ_parent['l'] = succ['r']
|
||||
else:
|
||||
succ_parent['r'] = succ['r']
|
||||
return root
|
||||
|
||||
def bst_list_all(root):
|
||||
result = []
|
||||
def inorder(node):
|
||||
if node:
|
||||
inorder(node['l'])
|
||||
result.append((node['n'], node['p']))
|
||||
inorder(node['r'])
|
||||
inorder(root)
|
||||
return result
|
||||
Loading…
Reference in New Issue
Block a user