diff --git a/KislyuninED/docks/data/1-st-exercize/main.py b/KislyuninED/docks/data/1-st-exercize/main.py index 1b05cd1..be8b53e 100644 --- a/KislyuninED/docks/data/1-st-exercize/main.py +++ b/KislyuninED/docks/data/1-st-exercize/main.py @@ -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 \ No newline at end of file + 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 \ No newline at end of file