исправлено двоичное дерево 3.0

This commit is contained in:
konnovaea 2026-04-26 21:17:46 +03:00
parent c76eb6f91b
commit c32fd836b5
3 changed files with 63 additions and 28 deletions

File diff suppressed because one or more lines are too long

View File

@ -88,7 +88,7 @@ def run_linked_experiments(records, mode_name):
def run_hash_experiments(records, mode_name):
print(f"хеш-таблица({mode_name})")
print(f"\n хеш-таблица({mode_name})")
print("вставка 10000 записей:")
@ -158,7 +158,7 @@ def run_hash_experiments(records, mode_name):
def run_bst_experiments(records, mode_name):
print(f"двоичное дерево({mode_name})")
print(f"\n двоичное дерево({mode_name})")
print("вставка 10000 записей:")

View File

@ -103,6 +103,7 @@ def bst_insert(root, name, phone):
def bst_find(root, name):
current = root
while current is not None:
if name == current['name']:
@ -113,45 +114,78 @@ def bst_find(root, name):
current = current['right']
return None
def _bst_find_mine(node):
def _bst_find_min(node):
current = node
while current and current['left'] is not None:
while current['left'] is not None:
current = current['left']
return current
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)
parent = None
current = root
while current is not None and current['name'] != name:
parent = current
if name < current['name']:
current = current['left']
else:
current = current['right']
if current is None:
return root
if root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
if current['left'] is None and current['right'] is None:
if parent is None:
return None
if parent['left'] == current:
parent['left'] = None
else:
parent['right'] = None
return root
current = root['right']
while current['left'] is not None:
current = current['left']
if current['left'] is None:
child = current['right']
elif current['right'] is None:
child = current['left']
else:
successor_parent = current
successor = current['right']
while successor['left'] is not None:
successor_parent = successor
successor = successor['left']
root['name'] = current['name']
root['phone'] = current['phone']
current['name'] = successor['name']
current['phone'] = successor['phone']
root['right'] = bst_delete(root['right'], current['name'])
if successor_parent['left'] == successor:
successor_parent['left'] = successor['right']
else:
successor_parent['right'] = successor['right']
return root
if parent is None:
return child
if parent['left'] == current:
parent['left'] = child
else:
parent['right'] = child
return root
def bst_list_all(root):
def bst_list_all(root):
records = []
def inorder(node):
if node is None:
if node is None:
return
inorder(node['left'])
records.append((node['name'], node['phone']))