59 lines
1.8 KiB
Python
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 |