From 823a9a7b937b4a6dc924b06e1f99398859e1b908 Mon Sep 17 00:00:00 2001 From: kaitlyngore Date: Sun, 22 May 2022 18:52:46 -0400 Subject: [PATCH 1/2] create add and find methods --- binary_search_tree/tree.py | 45 +++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/binary_search_tree/tree.py b/binary_search_tree/tree.py index cdd5abc..64537fc 100644 --- a/binary_search_tree/tree.py +++ b/binary_search_tree/tree.py @@ -17,13 +17,52 @@ def __init__(self): # Time Complexity: # Space Complexity: def add(self, key, value = None): - pass + node = TreeNode(key, value) + if self.root is None: + self.root = node + return self + + current = self.root + while current: + if current.key > key: + # Go left + if current.left is None: + current.left = node + return self + else: + current = current.left + else: + if current.right is None: + current.right = node + return self + else: + current = current.right # Time Complexity: # Space Complexity: def find(self, key): - pass - + if self.root is None: + return None + if self.root.key == key: + return self.root.value + + current = self.root + while current: + if key < current.key: + if not current.left: + return None + elif current.left.key == key: + return current.left.value + else: + current = current.left + else: + if not current.right: + return None + elif current.right.key == key: + return current.right.value + else: + current = current.right + # Time Complexity: # Space Complexity: def inorder(self): From 3d7f039e749579839946ca4bed0271225c245f6d Mon Sep 17 00:00:00 2001 From: kaitlyngore Date: Thu, 14 Jul 2022 17:44:59 -0400 Subject: [PATCH 2/2] added the rest of the required methods --- binary_search_tree/tree.py | 84 ++++++++++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 16 deletions(-) diff --git a/binary_search_tree/tree.py b/binary_search_tree/tree.py index 64537fc..b643692 100644 --- a/binary_search_tree/tree.py +++ b/binary_search_tree/tree.py @@ -14,8 +14,8 @@ class Tree: def __init__(self): self.root = None - # Time Complexity: - # Space Complexity: + # Time Complexity: O(log n) + # Space Complexity: O(n) def add(self, key, value = None): node = TreeNode(key, value) if self.root is None: @@ -38,8 +38,8 @@ def add(self, key, value = None): else: current = current.right - # Time Complexity: - # Space Complexity: + # Time Complexity: O(log n) + # Space Complexity: O(1) def find(self, key): if self.root is None: return None @@ -63,26 +63,78 @@ def find(self, key): else: current = current.right - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def inorder(self): - pass + node_list = [] + current = self.root + if current == None: + return node_list + while current: + node_list.insert(0, {"key": current.key, "value": current.value}) + current = current.left + # reset + current = self.root.right + while current: + node_list.append({"key": current.key, "value": current.value}) + current = current.right + return node_list + - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def preorder(self): - pass + node_list = [] + current = self.root + if current == None: + return node_list + while current: + node_list.append({"key": current.key, "value": current.value}) + current = current.left + + current = self.root.right + while current: + node_list.append({"key": current.key, "value": current.value}) + current = current.right + return node_list - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def postorder(self): - pass + node_list = [] + current = self.root + if current == None: + return node_list + self.postorder_helper(current, node_list) + return node_list + + def postorder_helper(self, current, node_list): + if current: + self.postorder_helper(current.left, node_list) + self.postorder_helper(current.right, node_list) + node_list.append({"key": current.key, "value": current.value}) + return node_list + - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(1) def height(self): - pass + current = self.root + if current is None: + return 0 + + return self.height_helper(current) + + def height_helper(self, current): + if current is None: + return 0 + + left_height = self.height_helper(current.left) + right_height = self.height_helper(current.right) + + return max(left_height, right_height) + 1 + # # Optional Method # # Time Complexity: