diff --git a/novikovsd/hashtab.py b/novikovsd/hashtab.py index c17880f..2c0aec8 100644 --- a/novikovsd/hashtab.py +++ b/novikovsd/hashtab.py @@ -85,4 +85,75 @@ def ht_list_all(buckets): entries.append((curr['name'], curr['phone'])) curr = curr['next'] entries.sort(key=lambda x: x[0]) - return entries \ No newline at end of file + return entries + +def bst_insert(root, name, phone): + new_node = {'name': name, 'phone': phone, 'left': None, 'right': None} + if root is None: + return new_node + + parent = None + curr = root + while curr is not None: + parent = curr + if name < curr['name']: + curr = curr['left'] + elif name > curr['name']: + curr = curr['right'] + else: + curr['phone'] = phone + return root + + if name < parent['name']: + parent['left'] = new_node + else: + parent['right'] = new_node + return root + + +def bst_find(root, name): + while root is not None: + if name == root['name']: + return root['phone'] + elif name < root['name']: + root = root['left'] + else: + root = root['right'] + return None + + +def _bst_min_node(node): + while node and node['left'] is not None: + node = node['left'] + return node + + +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'] + min_node = _bst_min_node(root['right']) + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root): + def inorder(node, res): + if node is None: + return + inorder(node['left'], res) + res.append((node['name'], node['phone'])) + inorder(node['right'], res) + result = [] + inorder(root, result) + return result \ No newline at end of file