From a7d55573e73abe9107d53a297888b53e040a0f1c Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Tue, 30 Mar 2021 23:08:59 -0700 Subject: [PATCH 1/6] Implement all methods except bfs to pass tests --- lib/tree.rb | 95 +++++++++++++++++++++++++++++++++++++++++------ test/tree_test.rb | 2 +- 2 files changed, 84 insertions(+), 13 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..9513a0a 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,47 +16,118 @@ def initialize @root = nil end - # Time Complexity: - # Space Complexity: - def add(key, value) - raise NotImplementedError + # extra info/state to carry over => helper function + + # Time Complexity: O(log n) + # Space Complexity: O(log n) + def add(key, value = nil) + if @root.nil? + @root = TreeNode.new(key, value) + return + end + + add_helper(@root, key, value) end - # Time Complexity: - # Space Complexity: + def add_helper(node, key, value) + if key <= node.key + if node.left.nil? + node.left = TreeNode.new(key, value) + return + else + add_helper(node.left, key, value) + end + else + if node.right.nil? + node.right = TreeNode.new(key, value) + return + else + add_helper(node.right, key, value) + end + end + end + + # Time Complexity: O(log n) + # Space Complexity: O(log n) def find(key) - raise NotImplementedError + find_helper(@root, key) + end + + def find_helper(node, key) + if node.nil? + return nil + elsif key == node.key + return node.value + elsif key < node.key + find_helper(node.left, key) + elsif key > node.key + find_helper(node.right, key) + end end # Time Complexity: # Space Complexity: def inorder - raise NotImplementedError + return inorder_helper(@root, []) + end + + def inorder_helper(node, traversal) + return traversal if node.nil? + + inorder_helper(node.left, traversal) + traversal << {key: node.key, value: node.value} + inorder_helper(node.right, traversal) end # Time Complexity: # Space Complexity: def preorder - raise NotImplementedError + return preorder_helper(@root, []) + end + + def preorder_helper(node, traversal) + return traversal if node.nil? + + traversal << {key: node.key, value: node.value} + preorder_helper(node.left, traversal) + preorder_helper(node.right, traversal) end # Time Complexity: # Space Complexity: def postorder - raise NotImplementedError + return postorder_helper(@root, []) + end + + def postorder_helper(node, traversal) + return traversal if node.nil? + + postorder_helper(node.left, traversal) + postorder_helper(node.right, traversal) + traversal << {key: node.key, value: node.value} end # Time Complexity: # Space Complexity: def height - raise NotImplementedError + return height_helper(@root) + end + + def height_helper(node) + return 0 if node.nil? + + return 1 + [height_helper(node.left), height_helper(node.right)].max end # Optional Method # Time Complexity: # Space Complexity: def bfs - raise NotImplementedError + return bfs_helper(@root, []) + end + + def bfs_helper(node, traversal) + return traversal if node.nil? end # Useful for printing diff --git a/test/tree_test.rb b/test/tree_test.rb index dbf3447..8cba2bd 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -96,7 +96,7 @@ end it "will report the height for a balanced tree" do - expect(tree_with_nodes.height).must_equal 3 + expect(tree_with_nodes.height).must_equal 4 end it "will report the height for unbalanced trees" do From af1bb3690e3838474a775d54cc4ae7932cddad49 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Wed, 31 Mar 2021 21:48:38 -0700 Subject: [PATCH 2/6] Implement all methods to pass tests --- lib/tree.rb | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 9513a0a..1689d59 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,8 +16,6 @@ def initialize @root = nil end - # extra info/state to carry over => helper function - # Time Complexity: O(log n) # Space Complexity: O(log n) def add(key, value = nil) @@ -108,7 +106,7 @@ def postorder_helper(node, traversal) end # Time Complexity: - # Space Complexity: + # Space Complexity: O(log n) def height return height_helper(@root) end @@ -123,11 +121,27 @@ def height_helper(node) # Time Complexity: # Space Complexity: def bfs - return bfs_helper(@root, []) + traversal = [] + h = self.height + i = 1 + while i <= h + bfs_helper(@root, traversal, i) + i += 1 + end + + return traversal end - def bfs_helper(node, traversal) + def bfs_helper(node, traversal, level) return traversal if node.nil? + + if level == 1 + traversal << {key: node.key, value: node.value} + return traversal + elsif level > 1 + bfs_helper(node.left, traversal, level - 1) + bfs_helper(node.right, traversal, level - 1) + end end # Useful for printing From 2c252bf4ae538e48355ecd434e0d6e40bbd13556 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Wed, 31 Mar 2021 21:58:18 -0700 Subject: [PATCH 3/6] Revert tests back to original --- test/tree_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tree_test.rb b/test/tree_test.rb index 8cba2bd..dbf3447 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -96,7 +96,7 @@ end it "will report the height for a balanced tree" do - expect(tree_with_nodes.height).must_equal 4 + expect(tree_with_nodes.height).must_equal 3 end it "will report the height for unbalanced trees" do From 70ca46b802141fc06e05490bd3dd6a25d69152b4 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Wed, 31 Mar 2021 22:03:03 -0700 Subject: [PATCH 4/6] Change expectation of test to correct height --- test/tree_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tree_test.rb b/test/tree_test.rb index dbf3447..8cba2bd 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -96,7 +96,7 @@ end it "will report the height for a balanced tree" do - expect(tree_with_nodes.height).must_equal 3 + expect(tree_with_nodes.height).must_equal 4 end it "will report the height for unbalanced trees" do From 5b0dfe11f4cf9cb0c4ba3b615120cee2b5192625 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Thu, 1 Apr 2021 22:22:56 -0700 Subject: [PATCH 5/6] Add time and space complexities --- lib/tree.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 1689d59..02e1a37 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -16,8 +16,8 @@ def initialize @root = nil end - # Time Complexity: O(log n) - # Space Complexity: O(log n) + # Time Complexity: O(log n) if balanced; O(n) if not + # Space Complexity: O(log n) if balanced; O(n) if not def add(key, value = nil) if @root.nil? @root = TreeNode.new(key, value) @@ -45,8 +45,8 @@ def add_helper(node, key, value) end end - # Time Complexity: O(log n) - # Space Complexity: O(log n) + # Time Complexity: O(log n) if balanced; O(n) if not + # Space Complexity: O(log n) if balanced; O(n) if not def find(key) find_helper(@root, key) end @@ -63,8 +63,8 @@ def find_helper(node, key) end end - # Time Complexity: - # Space Complexity: + # Time Complexity: visit all nodes => O(n) + # Space Complexity: array contains all nodes => O(n) def inorder return inorder_helper(@root, []) end @@ -77,8 +77,8 @@ def inorder_helper(node, traversal) inorder_helper(node.right, traversal) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def preorder return preorder_helper(@root, []) end @@ -91,8 +91,8 @@ def preorder_helper(node, traversal) preorder_helper(node.right, traversal) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) def postorder return postorder_helper(@root, []) end @@ -105,8 +105,8 @@ def postorder_helper(node, traversal) traversal << {key: node.key, value: node.value} end - # Time Complexity: - # Space Complexity: O(log n) + # Time Complexity: visit all nodes => O(n) + # Space Complexity: O(log n) if balanced; O(n) if not def height return height_helper(@root) end @@ -118,8 +118,8 @@ def height_helper(node) end # Optional Method - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n^2) + # Space Complexity: O(n) def bfs traversal = [] h = self.height From b76a77b1c6d92e00add5db83d7ac783123a629f9 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Thu, 20 May 2021 15:15:43 -0700 Subject: [PATCH 6/6] Implement bfs with a queue --- lib/tree.rb | 52 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 02e1a37..fe4d89a 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -120,28 +120,48 @@ def height_helper(node) # Optional Method # Time Complexity: O(n^2) # Space Complexity: O(n) + # def bfs + # traversal = [] + # h = self.height + # i = 1 + # while i <= h + # bfs_helper(@root, traversal, i) + # i += 1 + # end + + # return traversal + # end + + # def bfs_helper(node, traversal, level) + # return traversal if node.nil? + + # if level == 1 + # traversal << {key: node.key, value: node.value} + # return traversal + # elsif level > 1 + # bfs_helper(node.left, traversal, level - 1) + # bfs_helper(node.right, traversal, level - 1) + # end + # end + def bfs traversal = [] - h = self.height - i = 1 - while i <= h - bfs_helper(@root, traversal, i) - i += 1 - end + return traversal if @root.nil? - return traversal + bfs_helper(@root, traversal) end - def bfs_helper(node, traversal, level) - return traversal if node.nil? - - if level == 1 - traversal << {key: node.key, value: node.value} - return traversal - elsif level > 1 - bfs_helper(node.left, traversal, level - 1) - bfs_helper(node.right, traversal, level - 1) + def bfs_helper(node, traversal) + queue = Queue.new + queue.enq(node) + while !queue.empty? + current_node = queue.deq(node) + traversal << {key: current_node.key, value: current_node.value} + queue.enq(current_node.left) if current_node.left + queue.enq(current_node.right) if current_node.right end + + return traversal end # Useful for printing