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

View File

@ -77,7 +77,7 @@ def ht_list_all(buckets):
return records return records
def bst_insert(root, name, phone): def bst_insert(root, name, phone):
new_node = {'name': name, 'phone': phone, 'left': None, 'right': None} new_node = {'name': name, 'phone': phone, 'left': None, 'right': None}
if root is None: if root is None:
@ -98,11 +98,12 @@ def bst_insert(root, name, phone):
else: else:
current['phone'] = phone current['phone'] = phone
break break
return root return root
def bst_find(root, name): def bst_find(root, name):
current = root current = root
while current is not None: while current is not None:
if name == current['name']: if name == current['name']:
@ -113,49 +114,82 @@ def bst_find(root, name):
current = current['right'] current = current['right']
return None return None
def _bst_find_mine(node):
def _bst_find_min(node):
current = node current = node
while current and current['left'] is not None: while current['left'] is not None:
current = current['left'] current = current['left']
return current return current
def bst_delete(root, name):
def bst_delete(root, name):
if root is None: if root is None:
return None return None
if name < root['name']: parent = None
root['left'] = bst_delete(root['left'], name) current = root
elif name > root['name']:
root['right'] = bst_delete(root['right'], name) 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 return root
if root['left'] is None: if current['left'] is None and current['right'] is None:
return root['right'] if parent is None:
elif root['right'] is None: return None
return root['left'] if parent['left'] == current:
parent['left'] = None
else:
parent['right'] = None
return root
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']
current = root['right'] current['name'] = successor['name']
while current['left'] is not None: current['phone'] = successor['phone']
current = current['left']
if successor_parent['left'] == successor:
root['name'] = current['name'] successor_parent['left'] = successor['right']
root['phone'] = current['phone'] else:
successor_parent['right'] = successor['right']
root['right'] = bst_delete(root['right'], current['name'])
return root
if parent is None:
return child
if parent['left'] == current:
parent['left'] = child
else:
parent['right'] = child
return root return root
def bst_list_all(root): def bst_list_all(root):
records = [] records = []
def inorder(node): def inorder(node):
if node is None: if node is None:
return return
inorder(node['left']) inorder(node['left'])
records.append((node['name'], node['phone'])) records.append((node['name'], node['phone']))
inorder(node['right']) inorder(node['right'])
inorder(root) inorder(root)
return records return records