2026-rff_mp/pomelovsd/DataStruct/BinaryTree.py

59 lines
1.8 KiB
Python

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["left"] = bst_insert(root["left"], name, phone)
elif name > root["name"]:
root["right"] = bst_insert(root["right"], name, phone)
else:
root["phone"] = phone
return root
def bst_insert_sort(sorted_data, left, right):
if left > right:
return None
mid = (left + right) // 2
name, phone = sorted_data[mid]
root = create_node(name, phone)
root["left"] = bst_insert_sort(sorted_data, left, mid - 1)
root["right"] = bst_insert_sort(sorted_data, mid + 1, right)
return root
def bst_find(root, name):
if root is None:
return None
if name == root["name"]:
return root["phone"]
if name < root["name"]:
return bst_find(root["left"], name)
return bst_find(root["right"], name)
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"]
# Два ребенка
current = root["right"]
while current["left"] is not None:
current = current["left"]
root["name"] = current["name"]
root["phone"] = current["phone"]
# Удаляем преемника
root["right"] = bst_delete(root["right"], current["name"])
return root