From f9785635c3ebac172e118277d3aaea96defcaba3 Mon Sep 17 00:00:00 2001 From: Blaine Date: Thu, 15 Apr 2021 16:41:09 -0700 Subject: [PATCH 1/4] implimented methods --- lib/tree.rb | 123 ++++++++++++++++++++++++++++++++++++++++------ test/tree_test.rb | 17 ++++--- 2 files changed, 118 insertions(+), 22 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..668aa9c 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -2,12 +2,12 @@ class TreeNode attr_reader :key, :value attr_accessor :left, :right - def initialize(key, val) + def initialize(key, val) @key = key @value = val @left = nil @right = nil - end + end end class Tree @@ -16,42 +16,137 @@ def initialize @root = nil end - # Time Complexity: - # Space Complexity: - def add(key, value) - raise NotImplementedError + # Time Complexity: O(log n) + # Space Complexity: [O(1)-if it's a loop] - why do I wanna say O(n)?? help me. + # Try with a while loop + def add(key, value = nil) + if @root.nil? + @root = TreeNode.new(key, value) + else + add_helper(@root, key, value) + end end - # Time Complexity: - # Space Complexity: + def add_helper(current, key, value) + # if current = return TreeNode.new + if key < current.key + # if current.left is nil place the new node + # otherwise make current.left the new current and run through the same checks + if current.left.nil? + current.left = TreeNode.new(key, value) + return + else + add_helper(current.left, key, value) + end + else + if current.right.nil? + current.right = TreeNode.new(key, value) + return + else + add_helper(current.right, key, value) + end + end + end + + # Time Complexity: O(log n) + # Space Complexity: O(1) def find(key) - raise NotImplementedError + return find_helper(@root, key) + end + + def find_helper(current, key) + if current.nil? + return nil + end + if current.key == key + return current.value + end + if key > current.key + return find_helper(current.right, key) + else + return find_helper(current.left, key) + end end # Time Complexity: # Space Complexity: + # left-root-right def inorder - raise NotImplementedError + # current = @root + inorder_helper(@root, []) end + def inorder_helper(current, values) # Values is an array + if current.nil? + return values + end + inorder_helper(current.left, values) + values.push({:key=>current.key, :value=>current.value}) + inorder_helper(current.right, values) + return values + end + + # Time Complexity: # Space Complexity: + # root-left-right def preorder - raise NotImplementedError + preorder_helper(@root, []) + end + + def preorder_helper(current, values) + if current.nil? + return values + end + values.push({:key=>current.key, :value=>current.value}) + preorder_helper(current.left, values) + preorder_helper(current.right, values) + return values end # Time Complexity: # Space Complexity: + # left-right-root def postorder - raise NotImplementedError + postorder_helper(@root, []) end - # Time Complexity: + def postorder_helper(current, values) + if current.nil? + return values + end + postorder_helper(current.left, values) + postorder_helper(current.right, values) + values.push({:key=>current.key, :value=>current.value}) + return values + end + + # Time Complexity: O(n)^2 # Space Complexity: def height - raise NotImplementedError + # raise NotImplementedError + height_helper(@root) + end + def height_helper(current) + if current.nil? + return 0 + end + left_height = height_helper(current.left) + right_height = height_helper(current.right) + if left_height > right_height + return left_height + 1 + else + return right_height + 1 + end + # return [left_height, right_height].max + # left_height = height_helper(current.left) + 1 + # right_height = height_helper(current.right) + 1 + # return [left_height, right_height].max + # return 1 + [height_helper(current.left),height_helper(current.right)].max end + +# ********************************************************************** # Optional Method # Time Complexity: # Space Complexity: diff --git a/test/tree_test.rb b/test/tree_test.rb index dbf3447..78b563d 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -1,4 +1,5 @@ require_relative 'test_helper' +require 'pry' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new @@ -39,8 +40,8 @@ it "will return the tree in order" do expect(tree_with_nodes.inorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"}, - {:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"}, - {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] + {:key=>5, :value=>"Peter"}, {:key=>10, :value=>"Karla"}, + {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] end end @@ -64,20 +65,20 @@ it "will return the tree in postorder" do expect(tree_with_nodes.postorder).must_equal [{:key=>1, :value=>"Mary"}, {:key=>3, :value=>"Paul"}, - {:key=>25, :value=>"Kari"}, {:key=>15, :value=>"Ada"}, - {:key=>10, :value=>"Karla"}, {:key=>5, :value=>"Peter"}] + {:key=>25, :value=>"Kari"}, {:key=>15, :value=>"Ada"}, + {:key=>10, :value=>"Karla"}, {:key=>5, :value=>"Peter"}] end end - describe "breadth first search" do + xdescribe "breadth first search" do it "will give an empty array for an empty tree" do expect(tree.bfs).must_equal [] end it "will return an array of a level-by-level output of the tree" do expect(tree_with_nodes.bfs).must_equal [{:key=>5, :value=>"Peter"}, {:key=>3, :value=>"Paul"}, - {:key=>10, :value=>"Karla"}, {:key=>1, :value=>"Mary"}, - {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] + {:key=>10, :value=>"Karla"}, {:key=>1, :value=>"Mary"}, + {:key=>15, :value=>"Ada"}, {:key=>25, :value=>"Kari"}] end end @@ -96,7 +97,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 782cdf2b30a91c34e079efa307f3f0118271d208 Mon Sep 17 00:00:00 2001 From: Blaine Date: Thu, 15 Apr 2021 16:43:12 -0700 Subject: [PATCH 2/4] added time & space --- lib/tree.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 668aa9c..6cb8135 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -68,8 +68,8 @@ def find_helper(current, key) end end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) # left-root-right def inorder # current = @root @@ -87,8 +87,8 @@ def inorder_helper(current, values) # Values is an array end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) # root-left-right def preorder preorder_helper(@root, []) @@ -104,8 +104,8 @@ def preorder_helper(current, values) return values end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) + # Space Complexity: O(n) # left-right-root def postorder postorder_helper(@root, []) @@ -122,7 +122,7 @@ def postorder_helper(current, values) end # Time Complexity: O(n)^2 - # Space Complexity: + # Space Complexity: O(n) def height # raise NotImplementedError height_helper(@root) From f0f45a6c13003b847b854fdd6194a9537aecf88d Mon Sep 17 00:00:00 2001 From: Blaine Date: Thu, 15 Apr 2021 16:44:01 -0700 Subject: [PATCH 3/4] cleaned notes --- lib/tree.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 6cb8135..38fa49d 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -138,11 +138,6 @@ def height_helper(current) else return right_height + 1 end - # return [left_height, right_height].max - # left_height = height_helper(current.left) + 1 - # right_height = height_helper(current.right) + 1 - # return [left_height, right_height].max - # return 1 + [height_helper(current.left),height_helper(current.right)].max end From db0c3e7d9801647e1fc937567e199c94071ead8f Mon Sep 17 00:00:00 2001 From: Blaine Date: Sun, 23 May 2021 23:41:44 -0700 Subject: [PATCH 4/4] bfs --- lib/tree.rb | 22 +++++++++++++++++++--- test/tree_test.rb | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 38fa49d..1877d38 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -143,10 +143,26 @@ def height_helper(current) # ********************************************************************** # Optional Method - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) Does shift add time? O(n)^2? + # Space Complexity: O(n) def bfs - raise NotImplementedError + return [] if @root.nil? + + to_be_chkd = [@root] + output = [] + + while to_be_chkd.length > 0 + current = to_be_chkd.shift + # argument + output.push({:key=>current.key, :value=>current.value}) + if current.left != nil + to_be_chkd.push(current.left) + end + if current.right != nil + to_be_chkd.push(current.right) + end + end + return output end # Useful for printing diff --git a/test/tree_test.rb b/test/tree_test.rb index 78b563d..04ca96f 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -70,7 +70,7 @@ end end - xdescribe "breadth first search" do + describe "breadth first search" do it "will give an empty array for an empty tree" do expect(tree.bfs).must_equal [] end