diff --git a/lomakinae/docs/data/01/src/bst.py b/lomakinae/docs/data/01/src/bst.py new file mode 100644 index 0000000..0446b06 --- /dev/null +++ b/lomakinae/docs/data/01/src/bst.py @@ -0,0 +1,65 @@ +def _bst_new_node(name, phone): + return {'name': name, 'phone': phone, 'left': None, 'right': None} + + +def bst_insert(root, name, phone): + if root is None: + return _bst_new_node(name, phone) + + if name == root['name']: + root['phone'] = phone + elif name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + else: + root['right'] = bst_insert(root['right'], name, phone) + + return root + + +def bst_find(root, name): + if root is None: + return None + + if name == root['name']: + return root['phone'] + elif name < root['name']: + return bst_find(root['left'], name) + else: + return bst_find(root['right'], name) + + +def _bst_min_node(root): + node = root + while 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: + # node found — three cases + if root['left'] is None: + return root['right'] + if root['right'] is None: + return root['left'] + + # two children: replace node with in-order successor + successor = _bst_min_node(root['right']) + root['name'] = successor['name'] + root['phone'] = successor['phone'] + root['right'] = bst_delete(root['right'], successor['name']) + + return root + + +def bst_list_all(root): + if root is None: + return [] + return bst_list_all(root['left']) + [(root['name'], root['phone'])] + bst_list_all(root['right'])