From 05874c4cccca0e0473a174f804d8a48a930a930f Mon Sep 17 00:00:00 2001 From: ChelseaC13 Date: Mon, 31 Aug 2020 00:03:05 -0700 Subject: [PATCH 1/3] all but height done --- lib/tree.rb | 164 +++++++++++++++++++++++++++++++++++++++++----- test/tree_test.rb | 22 +++---- 2 files changed, 159 insertions(+), 27 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index c0d4b51..18b1ec3 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -14,42 +14,174 @@ class Tree attr_reader :root def initialize @root = nil + @inOrderArray = [] + @count = 0 end - # Time Complexity: - # Space Complexity: + # Time Complexity: log n because it is binary to find where to add the node + # Space Complexity: O(n) due to recursion def add(key, value) - raise NotImplementedError + if @root == nil + @root = TreeNode.new(key, value) + return + end + + current = @root + add_helper(current, key, value) end - # Time Complexity: - # Space Complexity: + def add_helper(current, key, value) + if current.key >= key + if current.left + current = current.left + add_helper(current, key, value) + else + newNode = TreeNode.new(key, value) + current.left = newNode + end + elsif current.key < key + + if current.right + current = current.right + add_helper(current, key, value) + else + newNode = TreeNode.new(key, value) + current.right = newNode + end + end + end + + # Time Complexity: log n due to the binary search + # Space Complexity: O(n) due to recursion def find(key) - raise NotImplementedError + if !@root + return nil + end + + current = @root + return find_helper(current, key) end - # Time Complexity: - # Space Complexity: + def find_helper(current, searchKey) + if current.key == searchKey + return current.value + end + + if current.key > searchKey + current = current.left + return find_helper(current, searchKey) + elsif current.key < searchKey + current = current.right + return find_helper(current, searchKey) + end + end + + # Time Complexity: O(n) because it has to go through every node. + # Space Complexity: O(n) due to the recursive stack def inorder - raise NotImplementedError + if @root == nil + return [] + end + + current = @root + getInOrder(current) + return @inOrderArray end - # Time Complexity: - # Space Complexity: + def getInOrder(node) + if node.left != nil + getInOrder(node.left) + end + + @inOrderArray.push({:key=>node.key, :value=>node.value}) + + if node.right != nil + getInOrder(node.right) + end + end + + # Time Complexity: O(n) because it has to go through every node. + # Space Complexity: O(n) due to the recursive stack def preorder - raise NotImplementedError + if @root == nil + return [] + end + + current = @root + getPreOrder(current) + return @inOrderArray end - # Time Complexity: - # Space Complexity: + def getPreOrder(node) + @inOrderArray.push({:key=>node.key, :value=>node.value}) + + if node.left != nil + getPreOrder(node.left) + end + + if node.right != nil + getPreOrder(node.right) + end + end + + # Time Complexity: O(n) because it has to go through every node. + # Space Complexity: O(n) due to the recursive stack def postorder - raise NotImplementedError + if @root == nil + return [] + end + + current = @root + getPostOrder(current) + return @inOrderArray + end + + def getPostOrder(node) + + if node.left != nil + getPostOrder(node.left) + end + + if node.right != nil + getPostOrder(node.right) + end + + @inOrderArray.push({:key=>node.key, :value=>node.value}) end # Time Complexity: # Space Complexity: def height - raise NotImplementedError + if @root == nil + return 0 + end + + current = @root + @count += 1 + + if current.left == nil && current.right == nil + return @count + end + + getHeight(current, @count) + return @count + end + + def getHeight(node, count) + + if node.left != nil + count += 1 + getHeight(node.left, count) + end + + if node.right != nil + count += 1 + getHeight(node.right, count) + end + + if @count < count + @count = count + end end # Optional Method diff --git a/test/tree_test.rb b/test/tree_test.rb index 21c4a80..5dd507f 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -77,17 +77,17 @@ end end - 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"}] - end - end + # 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"}] + # end + # end describe "height" do it "will return 0 for an empty tree" do From 865a0fa33944ef8be851b55804dfdbebaee5c275 Mon Sep 17 00:00:00 2001 From: ChelseaC13 Date: Mon, 31 Aug 2020 20:55:50 -0700 Subject: [PATCH 2/3] height is working! --- lib/tree.rb | 32 +++++++++++++++++--------------- test/tree_test.rb | 22 +++++++++++----------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index 18b1ec3..af69ef3 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -15,7 +15,6 @@ class Tree def initialize @root = nil @inOrderArray = [] - @count = 0 end # Time Complexity: log n because it is binary to find where to add the node @@ -157,30 +156,33 @@ def height end current = @root - @count += 1 + height = 1 - if current.left == nil && current.right == nil - return @count - end + # if current.left == nil && current.right == nil + # return @count + # end - getHeight(current, @count) - return @count + height = getHeight(current, height) + return height end - def getHeight(node, count) - + def getHeight(node, height) + + left = height + right = height + if node.left != nil - count += 1 - getHeight(node.left, count) + left = getHeight(node.left, height +1) end if node.right != nil - count += 1 - getHeight(node.right, count) + right = getHeight(node.right, height + 1) end - if @count < count - @count = count + if left >= right + return left + else + return right end end diff --git a/test/tree_test.rb b/test/tree_test.rb index 5dd507f..21c4a80 100644 --- a/test/tree_test.rb +++ b/test/tree_test.rb @@ -77,17 +77,17 @@ end end - # 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"}] - # end - # end + 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"}] + end + end describe "height" do it "will return 0 for an empty tree" do From 711919bb03e3f6a1bc75d3cd06ba98584a28da03 Mon Sep 17 00:00:00 2001 From: ChelseaC13 Date: Mon, 31 Aug 2020 21:10:40 -0700 Subject: [PATCH 3/3] forgot to update complexities --- lib/tree.rb | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/tree.rb b/lib/tree.rb index af69ef3..36e851c 100644 --- a/lib/tree.rb +++ b/lib/tree.rb @@ -18,7 +18,7 @@ def initialize end # Time Complexity: log n because it is binary to find where to add the node - # Space Complexity: O(n) due to recursion + # Space Complexity: worst case O(n) because we hit every node better average case like in a balanced tree it would be O(log n) def add(key, value) if @root == nil @root = TreeNode.new(key, value) @@ -51,7 +51,7 @@ def add_helper(current, key, value) end # Time Complexity: log n due to the binary search - # Space Complexity: O(n) due to recursion + # Space Complexity: worst case O(n) because we hit every node better average case like in a balanced tree it would be O(log n) def find(key) if !@root return nil @@ -76,7 +76,7 @@ def find_helper(current, searchKey) end # Time Complexity: O(n) because it has to go through every node. - # Space Complexity: O(n) due to the recursive stack + # Space Complexity: worst case O(n) because we hit every node better average case like in a balanced tree it would be O(log n) def inorder if @root == nil return [] @@ -100,7 +100,7 @@ def getInOrder(node) end # Time Complexity: O(n) because it has to go through every node. - # Space Complexity: O(n) due to the recursive stack + # Space Complexity: worst case O(n) because we hit every node better average case like in a balanced tree it would be O(log n) def preorder if @root == nil return [] @@ -124,7 +124,7 @@ def getPreOrder(node) end # Time Complexity: O(n) because it has to go through every node. - # Space Complexity: O(n) due to the recursive stack + # Space Complexity: worst case O(n) because we hit every node, better average case like in a balanced tree it would be O(log n) def postorder if @root == nil return [] @@ -148,8 +148,8 @@ def getPostOrder(node) @inOrderArray.push({:key=>node.key, :value=>node.value}) end - # Time Complexity: - # Space Complexity: + # Time Complexity: O(n) because we hit eery node + # Space Complexity: worst case O(n) because we hit every node better average case like in a balanced tree it would be O(log n) def height if @root == nil return 0 @@ -158,10 +158,6 @@ def height current = @root height = 1 - # if current.left == nil && current.right == nil - # return @count - # end - height = getHeight(current, height) return height end