From 6d0952b2f351d7fa00aa0e44dec03d7f5c8227ae Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 1 Sep 2020 23:28:19 -0700 Subject: [PATCH 1/4] add and find passing tests --- lib/tree.rb | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..640367a 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,16 +16,53 @@ def initialize @root = nil end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(log n) + # Space Complexity: O(log n) def add(key, value) - raise NotImplementedError + new_node = TreeNode.new(key, value) + + if @root == nil + @root = new_node + else + add_helper(@root, new_node) + end + end - # Time Complexity: - # Space Complexity: + def add_helper(current, new_node) + if new_node.key <= current.key + if current.left.nil? + return current.left = new_node + else + add_helper(current.left, new_node) + end + else + if current.right.nil? + return current.right = new_node + else + add_helper(current.right, new_node) + end + end + end + + # Time Complexity: O(log n) + # Space Complexity: O(log n) def find(key) - raise NotImplementedError + return nil if @root.nil? + current = @root + + while current != nil + if key == current.key + return current.value + elsif key < current.key + current = current.left + else + current = current.right + end + end + + # if not found + return nil end # Time Complexity: From 6ef71a594a27542d12a5618886a6e53c811e7702 Mon Sep 17 00:00:00 2001 From: thenora Date: Tue, 1 Sep 2020 23:50:34 -0700 Subject: [PATCH 2/4] in order passing tests --- lib/tree.rb | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 640367a..d3764b9 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -65,22 +65,32 @@ def find(key) return nil end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def inorder - raise NotImplementedError + # This method returns an array of all the elements in the tree, in order. + inorder_array = [] + inorder_helper(@root, inorder_array) end - # Time Complexity: - # Space Complexity: + def inorder_helper(current, array) + return array if current.nil? + + inorder_helper(current.left, array) + array << { key: current.key, value: current.value } + inorder_helper(current.right, array) + end + + # Time Complexity: O(n) + # Space Complexity: O(n) def preorder - raise NotImplementedError + # This method returns an array of all the elements in a preorder fashion (root, left, right). end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def postorder - raise NotImplementedError + # This method returns an array of all the elements in a postorder fashion (left, right, root). end # Time Complexity: From 1e5cffd5003c2940360f6ef9c3bae10312e324ae Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 2 Sep 2020 00:02:29 -0700 Subject: [PATCH 3/4] post & pre passing tests --- lib/tree.rb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/tree.rb b/lib/tree.rb index d3764b9..3b0af16 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -68,7 +68,7 @@ def find(key) # Time Complexity: O(n) # Space Complexity: O(n) def inorder - # This method returns an array of all the elements in the tree, in order. + # This method returns an array of all the elements in the tree, in order. (left, root, right) inorder_array = [] inorder_helper(@root, inorder_array) end @@ -85,12 +85,34 @@ def inorder_helper(current, array) # Space Complexity: O(n) def preorder # This method returns an array of all the elements in a preorder fashion (root, left, right). + preorder_array = [] + + preorder_helper(@root, preorder_array) + end + + def preorder_helper(current, array) + return array if current.nil? + + array << { key: current.key, value: current.value } + preorder_helper(current.left, array) + preorder_helper(current.right, array) end # Time Complexity: O(n) # Space Complexity: O(n) def postorder # This method returns an array of all the elements in a postorder fashion (left, right, root). + postorder_array = [] + + postorder_helper(@root, postorder_array) + end + + def postorder_helper(current, array) + return array if current.nil? + + postorder_helper(current.left, array) + postorder_helper(current.right, array) + array << { key: current.key, value: current.value } end # Time Complexity: From c1e9c4f0b8c728b181568eda7b43acd1001acb45 Mon Sep 17 00:00:00 2001 From: thenora Date: Wed, 2 Sep 2020 00:20:59 -0700 Subject: [PATCH 4/4] height passing tests --- lib/tree.rb | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 3b0af16..3701173 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -115,10 +115,23 @@ def postorder_helper(current, array) array << { key: current.key, value: current.value } end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) - worst case for unbalanced, best case O(log n) + # Space Complexity: O(1) def height - raise NotImplementedError + # return 0 if @root == nil + + height_helper(@root) + end + + def height_helper(current, count = 0) + return count if current.nil? + + + left_height = height_helper(current.left, count + 1) + right_height = height_helper(current.right, count + 1) + return [left_height, right_height].max + + # return left_height > right_height ? left_height : right_height end # Optional Method