From c915f50377b7b16ad199210a88334f047c635704 Mon Sep 17 00:00:00 2001 From: SavelevMI Date: Thu, 21 May 2026 13:37:55 +0000 Subject: [PATCH] [1] Implement binary search tree (BST) for phonebook --- SavelevMI/docs/data/1-st-exersize/bst.py | 66 ++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 SavelevMI/docs/data/1-st-exersize/bst.py diff --git a/SavelevMI/docs/data/1-st-exersize/bst.py b/SavelevMI/docs/data/1-st-exersize/bst.py new file mode 100644 index 0000000..70d2952 --- /dev/null +++ b/SavelevMI/docs/data/1-st-exersize/bst.py @@ -0,0 +1,66 @@ +# Двоичное дерево поиска (не сбалансированное) + +def create_node(name, phone): + return {'name': name, 'phone': phone, 'left': None, 'right': None} + +def bst_insert(root, name, phone): + if root is None: + return 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): + if root is None: + return None + if name == root['name']: + return root['phone'] + elif name < root['name']: + return bst_find(root['left'], name) + else: + return bst_find(root['right'], name) + +def _find_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'] + + # Узел имеет двух потомков: заменяем наименьшим из правого поддерева + min_node = _find_min(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): + result = [] + + def inorder(node): + if node is None: + return + inorder(node['left']) + result.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return result \ No newline at end of file