from typing import Any, Callable def bst_create_node(name: str, phone: str, left: dict = None, right: dict = None) -> dict: return { 'name': name, 'phone': phone, 'left': left, 'right': right } def comparison_name(name_main: str, name_second: str) -> str: """Сравнение аргументов :param name_main: :type name_main: str :param name_second: _description_ :type name_second: str :return: _description_ :rtype: str """ return 'right' if name_main >= name_second else 'left' def bst_insert(root: dict, name: str, phone: str) -> dict: if root is None: return bst_create_node(name, phone) path = comparison_name(root['name'], name) root[path] = bst_insert(root[path], name, phone) return root def bst_create_tree(data: list[dict]) -> dict: if data is None or len(data) == 0: raise ValueError("Список пустой!") base = bst_create_node(**data[0]) for var in data[1:]: bst_insert(base, **var) return base def bst_find(root: dict, name: str) -> str | None: if root is None: return None if root['name'] == name: return root['phone'] path = comparison_name(root['name'], name) return bst_find(root[path], name) def bst_delete(root, name: str, delete_node: bool = False) -> Any: if root is None: return None if root['name'] == name: if delete_node: root else: pass path = comparison_name(root['name'], name) return bst_find(root[path], name) def bst_list_all(root: dict) -> list[dict]: pass