diff --git a/config.json b/config.json index ccb1c726ba..c6ccd855b1 100644 --- a/config.json +++ b/config.json @@ -429,6 +429,12 @@ "difficulty": 1, "topics": [ ] + }, + { + "slug": "binary-search-tree", + "difficulty": 1, + "topics": [ + ] } ], "deprecated": [ diff --git a/exercises/binary-search-tree/binary_search_tree_test.py b/exercises/binary-search-tree/binary_search_tree_test.py new file mode 100644 index 0000000000..08be53197d --- /dev/null +++ b/exercises/binary-search-tree/binary_search_tree_test.py @@ -0,0 +1,25 @@ +import unittest + +from binary_search_tree import BST + + +class BSTTests(unittest.TestCase): + def setUp(self): + self.tree = BST(4) + + def test_insert(self): + self.tree.insert(2) + self.tree.insert(1) + self.assertTrue(self.tree.search(2)) + self.assertTrue(self.tree.search(1)) + + def test_search(self): + self.tree.insert(2) + self.tree.insert(1) + self.assertTrue(self.tree.search(2)) + self.assertTrue(self.tree.search(1)) + self.assertFalse(self.tree.search(9)) + self.assertFalse(self.tree.search(20)) + +if __name__ == '__main__': + unittest.main() diff --git a/exercises/binary-search-tree/example.py b/exercises/binary-search-tree/example.py new file mode 100644 index 0000000000..baff090459 --- /dev/null +++ b/exercises/binary-search-tree/example.py @@ -0,0 +1,51 @@ +class Node(object): + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + +class BST(object): + def __init__(self, root): + self.root = Node(root) + + def insert(self, new_val): + if new_val > self.root.value: + if self.root.right is None: + self.root.right = Node(new_val) + else: + self.pre_insert(self.root.right, new_val) + elif new_val < self.root.value: + if self.root.left is None: + self.root.left = Node(new_val) + else: + self.pre_insert(self.root.left, new_val) + + def pre_insert(self, node, val): + if node.right is None and val > node.value: + node.right = Node(val) + elif node.left is None and val < node.value: + node.left = Node(val) + elif val > node.value: + self.pre_insert(node.right, val) + else: + self.pre_insert(node.left, val) + + def search(self, find_val): + current = self.root + if find_val == current.value: + return True + else: + while current.left is not None or current.right is not None: + if find_val == current.value: + return True + elif find_val > current.value and current.right is not None: + current = current.right + elif find_val < current.value and current.left is not None: + current = current.left + else: + break + if current.left is None and current.right is None: + if find_val == current.value: + return True + return False