From 77485a5318a75c716d4616edec5ab30b971e63fc Mon Sep 17 00:00:00 2001 From: not why Date: Mon, 25 May 2026 00:44:07 +0300 Subject: [PATCH] implemented bst --- soninrv/docs/data/lab1/phonebook.py | 73 +++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/soninrv/docs/data/lab1/phonebook.py b/soninrv/docs/data/lab1/phonebook.py index ae7e231..7e9d99d 100644 --- a/soninrv/docs/data/lab1/phonebook.py +++ b/soninrv/docs/data/lab1/phonebook.py @@ -88,4 +88,77 @@ def ht_list_all(buckets): for head in buckets: result.extend(ll_list_all(head)) result.sort(key=lambda x: x[0]) + return result + +# 3. ДВОИЧНОЕ ДЕРЕВО ПОИСКА (BST) + +def bst_create_node(name, phone): + return {'name': name, 'phone': phone, 'left': None, 'right': None} + + +def bst_insert(root, name, phone): + """Вставить / обновить. Возвращает корень.""" + if root is None: + return bst_create_node(name, phone) + if name == root['name']: + root['phone'] = phone + elif name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + else: + root['right'] = bst_insert(root['right'], name, phone) + return root + + +def bst_find(root, name): + """Вернуть телефон или None.""" + while root is not None: + if name == root['name']: + return root['phone'] + elif name < root['name']: + root = root['left'] + else: + root = root['right'] + return None + + +def _bst_min(node): + while node['left'] is not None: + node = node['left'] + return node + + +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: + return root['right'] + if root['right'] is None: + return root['left'] + # Два потомка: заменить минимальным из правого поддерева + successor = _bst_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): + """Центрированный (in-order) обход → отсортированный список.""" + result = [] + stack = [] + node = root + while stack or node is not None: + while node is not None: + stack.append(node) + node = node['left'] + node = stack.pop() + result.append((node['name'], node['phone'])) + node = node['right'] return result \ No newline at end of file