2026-rff_mp/skorohodovsa/task_1/binary_tree.py

73 lines
1.7 KiB
Python
Raw Normal View History

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